`
20386053
  • 浏览: 462043 次
文章分类
社区版块
存档分类
最新评论

memset用法详解

 
阅读更多

memest原型(pleasetype"manmemset"inyourshell)


void*memset(void*s,intc,size_tn);


memset:作用是在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法。


常见的三种错误


第一:搞反了c和n的位置.


一定要记住如果要把一个chara[20]清零,一定是memset(a,0,20)
而不是memset(a,20,0)


第二:过度使用memset,我想这些程序员可能有某种心理阴影,他们惧怕未经初始化的内存,所以他们会写出这样的代码:


charbuffer[20];


memset(buffer,0,sizeof((char)*20));
strcpy(buffer,"123");


这里的memset是多余的.因为这块内存马上就被覆盖了,清零没有意义.


第三:其实这个错误严格来讲不能算用错memset,但是它经常在使用memset的场合出现


intsome_func(structsomething*a){


memset(a,0,sizeof(a));

}


:为何要用memset置零?memset(&Address,0,sizeof(Address));经常看到这样的用法,其实不用的话,分配数据的时候,剩余的空间也会置零的。


答:1.如果不清空,可能会在测试当中出现野值。你做下面的试验看看结果()


charbuf[5];


CStringstr,str1;//memset(buf,0,sizeof(buf));for(inti=0;i<5;i++){str.Format(“%d“,buf[i]);str1+=str;}TRACE(“%s\r\n“,str1)


2.其实不然!特别是对于字符指针类型的,剩余的部分通常是不会为0的,不妨作一个试验,定义一个字符数组,并输入一串字符,如果不用memset实现清零,使用MessageBox显示出来就会有乱码(0表示NULL,如果有,就默认字符结束,不会输出后面的乱码)


问:


如下demo是可以的,能把数组中的元素值都设置成字符1
#include<iostream>
#include<cstring>
usingnamespacestd;
intmain()
{
chara[5];
memset(a,'1',5);
for(inti=0;i<5;i++)
cout<<a[i]<<"";
system("pause");
return0;
}
而,如下程序想吧数组中的元素值设置成1,却是不可行的
#include<iostream>
#include<cstring>
usingnamespacestd;
intmain()
{
inta[5];
memset(a,1,5);//这里改成memset(a,1,5*sizeof(int))也是不可以的
for(inti=0;i<5;i++)
cout<<a[i]<<"";
system("pause");
return0;
}
问题是:


1,第一个程序为什么可以,而第二个不行,
2,不想要用for,或是while循环来初始化inta[5];能做到吗?(有没有一个像memset()这样的函数初始化)


答:


1.因为第一个程序的数组a是字符型的,字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的,所以你输出没有问题。而第二个程序a是整型的,使用memset还是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。你看看你输出结果是否这样?


2.如果用memset(a,1,20);
就是对a指向的内存的20个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是1000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了。


memset和strcpy的区别

1.void *memset(void *s,int c,size_t n)
总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。

2.例子
#i nclude
#i nclude

main(){
char *s="Golden Global View";

clrscr();

memset(s,G,6);
printf("%s",s);

getchar();
return 0;
} 
3。memset() 函数常用于内存空间初始化。如:
char str[100];
memset(str,0,100);

4。memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘\0’;例:char a[100];memset(a, \0, sizeof(a));

memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。

strcpy就只能拷贝字符串了,它遇到\0就结束拷贝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。

5.补充:某人的一点心得
memset可以方便的清空一个结构类型的变量或数组。

如:
struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};

对于变量
struct sample_strcut stTest;

一般情况下,清空stTest的方法:
stTest.csName[0]=\0;
stTest.iSeq=0;
stTest.iType=0;

用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));

如果是数组:
struct sample_struct TEST[10];

memset(TEST,0,sizeof(struct sample_struct)*10);

6。strcpy
原型:extern char *strcpy(char *dest,char *src);
用法:#i nclude
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
memcpy
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
用法:#i nclude
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
memset
原型:extern void *memset(void *buffer, int c, int count);
用法:#i nclude
功能:把buffer所指内存区域的前count个字节设置成字符c。
说明:返回指向buffer的指针。


分享到:
评论

相关推荐

    C语言memset用法详解.zip

    在C语言中,`memset`是一个非常重要的内存...通过理解和正确使用`memset`,程序员可以更有效地管理内存,提高代码的效率和可读性。在C语言编程中,它是一个不可或缺的工具,尤其是在处理大量数据初始化或清零操作时。

    memset用法 很详细

    ### memset函数详解与应用 `memset`是C/C++中一个非常重要的函数,用于内存操作,尤其是在初始化数据结构时极为常见。它属于`&lt;cstring&gt;`库,在标准C库中定义,用于填充一块连续的内存区域。 #### 函数原型 ```c ...

    memset函数使用详解.pdf

    memset 函数使用详解 memset 函数是一种常用的内存操作函数,主要用于将已开辟的内存空间设置为某个特定的值。其原型为 `void *memset(void *s, int c, size_t n)`,其作用是将已开辟的内存空间 `s` 的首 `n` 个...

    C++中memset函数用法详解

    例如,为了创建一个空的字符串,可以使用`memset`将字符数组的所有字节设置为零: ```cpp char str[100]; memset(str, '\0', sizeof(str)); ``` 在这个例子中,`str`数组的所有字节都被设置为NULL字符,即`\0`,...

    C语言memset函数使用方法详解

    C语言memset函数使用方法详解 一。函数原形 void * memset(void*s, int ch,size_t n) 二。函数作用 将以s内存地址为首的连续n个字节的内容置成ch,一般用来对大量结构体和数组进行清零 三。常见错误 1.搞反...

    包含string对象的结构与memset初始化操作

    值得注意的是,`memset`适用于对简单的数据类型或者连续的内存块进行初始化,但对于包含复杂类型(如`std::string`)的结构体来说,使用`memset`可能会导致意料之外的结果。 #### `std::string`类详解 `std::...

    memset ()函数.pdf

    memset() 函数详解 memset() 函数是 C 语言中的一个标准库函数,用于将某一块内存中的每个字节的内容全部设置为指定的 ASCII 值。该函数通常用于新申请的内存做初始化工作,以确保内存中的内容是可预期的。 函数...

    cstring用法详解.doc

    【cstring用法详解】 在C++编程中,`cstring`是一个包含了一系列字符串处理函数的头文件,它提供了处理C风格字符串(即以空字符`\0`结尾的字符数组)的功能。`cstring`库通常用于执行诸如复制、比较、查找、填充和...

    memset概述、原理及应用.pdf

    ### memset概述、原理及应用详解 #### 一、概述 `memset`是C语言标准库中的一个重要函数,用于将指定的内存区域的内容设置为特定的值。它在内存管理中扮演着重要的角色,特别是在初始化内存区域或填充固定值时。...

    C语言memset()函数.pdf

    ### C语言中的memset()函数详解 #### 一、概述 `memset()`是C语言标准库中的一个非常实用的函数,主要用于将一块连续的内存区域设置为一个特定的值。这个函数在程序开发过程中非常常见,尤其是在需要对较大规模的...

    C语言函数memset,memset,memcmp,memmove,memchr,memrchr,memccpy等使用

    ### C语言中的内存操作函数详解 #### 一、概述 C语言是一门广泛使用的编程语言,在实际开发过程中,经常会涉及到对内存的操作。为了方便开发者高效地处理内存问题,C语言提供了一系列内置函数来帮助实现内存的设置...

    详解C语言中的memset()函数

    C语言中的`memset()`函数是用于填充内存的实用工具,它允许程序员快速地将一块内存区域的前n个字节设置为一个特定的值。这个函数通常在初始化数组、清除缓冲区或者设置结构体默认值时非常有用。`memset()`定义在`...

    VC++中的数学函数及其用法详解.docx

    3. `memset(s, c, n)`:将`s`起始的`n`个字节设置为`c`的值,常用于清零数组或结构体。 这些函数极大地丰富了C++程序员处理数学问题和字符串的能力,使得编写代码更加高效和简洁。了解和熟练运用这些函数是提升C++...

    TCPIP协议详解卷三:事务.pdf

    - **填写服务器地址**:使用`memset`函数初始化Internet插口地址结构,并填充服务器的IP地址和端口号。 - **构造并向服务器发送请求**:客户程序构造请求消息,并使用`sendto`函数将其发送给服务器。 - **读取和处理...

    VC++中的数学函数及其用法详解.pdf

    3. `memset(s, c, n)`:将s地址开始的n个字节设置为字符c,常用于初始化数组或结构体。 这些函数是C++标准库的一部分,熟练掌握它们能极大地提升编程效率和代码质量。在实际编程中,开发者可以根据需求选择适当的...

    LinuxC函数详解

    Linux C函数详解涉及到Linux操作系统下C语言编程中常用的库函数。本书提供了丰富的Linux C函数使用示例,让读者能够快速掌握并应用于实际的程序设计中。以下为书中提到的一些函数和知识点的详细介绍: 字符测试函数...

    void 指针详解(用法、注意事项等等 )

    void 指针详解(用法、注意事项等等) void 指针是一种特殊的指针类型,它可以指向任何类型的对象,但是它自身的类型是未知的。因此,void 指针不能进行自增操作,因为系统不知道它指的内容的大小。 void 指针的...

    全面的framebuffer详解

    在Linux中,通过映射FrameBuffer设备到进程地址空间的方式来使用,如打开/dev/fb0设备,并通过mmap系统调用进行地址映射,然后使用memset函数清空屏幕。不过,这通常需要root权限来执行。FrameBuffer设备还提供了一...

Global site tag (gtag.js) - Google Analytics