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`是一个非常重要的内存...通过理解和正确使用`memset`,程序员可以更有效地管理内存,提高代码的效率和可读性。在C语言编程中,它是一个不可或缺的工具,尤其是在处理大量数据初始化或清零操作时。
### memset函数详解与应用 `memset`是C/C++中一个非常重要的函数,用于内存操作,尤其是在初始化数据结构时极为常见。它属于`<cstring>`库,在标准C库中定义,用于填充一块连续的内存区域。 #### 函数原型 ```c ...
memset 函数使用详解 memset 函数是一种常用的内存操作函数,主要用于将已开辟的内存空间设置为某个特定的值。其原型为 `void *memset(void *s, int c, size_t n)`,其作用是将已开辟的内存空间 `s` 的首 `n` 个...
例如,为了创建一个空的字符串,可以使用`memset`将字符数组的所有字节设置为零: ```cpp char str[100]; memset(str, '\0', sizeof(str)); ``` 在这个例子中,`str`数组的所有字节都被设置为NULL字符,即`\0`,...
C语言memset函数使用方法详解 一。函数原形 void * memset(void*s, int ch,size_t n) 二。函数作用 将以s内存地址为首的连续n个字节的内容置成ch,一般用来对大量结构体和数组进行清零 三。常见错误 1.搞反...
值得注意的是,`memset`适用于对简单的数据类型或者连续的内存块进行初始化,但对于包含复杂类型(如`std::string`)的结构体来说,使用`memset`可能会导致意料之外的结果。 #### `std::string`类详解 `std::...
memset() 函数详解 memset() 函数是 C 语言中的一个标准库函数,用于将某一块内存中的每个字节的内容全部设置为指定的 ASCII 值。该函数通常用于新申请的内存做初始化工作,以确保内存中的内容是可预期的。 函数...
【cstring用法详解】 在C++编程中,`cstring`是一个包含了一系列字符串处理函数的头文件,它提供了处理C风格字符串(即以空字符`\0`结尾的字符数组)的功能。`cstring`库通常用于执行诸如复制、比较、查找、填充和...
### memset概述、原理及应用详解 #### 一、概述 `memset`是C语言标准库中的一个重要函数,用于将指定的内存区域的内容设置为特定的值。它在内存管理中扮演着重要的角色,特别是在初始化内存区域或填充固定值时。...
### C语言中的memset()函数详解 #### 一、概述 `memset()`是C语言标准库中的一个非常实用的函数,主要用于将一块连续的内存区域设置为一个特定的值。这个函数在程序开发过程中非常常见,尤其是在需要对较大规模的...
### C语言中的内存操作函数详解 #### 一、概述 C语言是一门广泛使用的编程语言,在实际开发过程中,经常会涉及到对内存的操作。为了方便开发者高效地处理内存问题,C语言提供了一系列内置函数来帮助实现内存的设置...
C语言中的`memset()`函数是用于填充内存的实用工具,它允许程序员快速地将一块内存区域的前n个字节设置为一个特定的值。这个函数通常在初始化数组、清除缓冲区或者设置结构体默认值时非常有用。`memset()`定义在`...
3. `memset(s, c, n)`:将`s`起始的`n`个字节设置为`c`的值,常用于清零数组或结构体。 这些函数极大地丰富了C++程序员处理数学问题和字符串的能力,使得编写代码更加高效和简洁。了解和熟练运用这些函数是提升C++...
- **填写服务器地址**:使用`memset`函数初始化Internet插口地址结构,并填充服务器的IP地址和端口号。 - **构造并向服务器发送请求**:客户程序构造请求消息,并使用`sendto`函数将其发送给服务器。 - **读取和处理...
3. `memset(s, c, n)`:将s地址开始的n个字节设置为字符c,常用于初始化数组或结构体。 这些函数是C++标准库的一部分,熟练掌握它们能极大地提升编程效率和代码质量。在实际编程中,开发者可以根据需求选择适当的...
Linux C函数详解涉及到Linux操作系统下C语言编程中常用的库函数。本书提供了丰富的Linux C函数使用示例,让读者能够快速掌握并应用于实际的程序设计中。以下为书中提到的一些函数和知识点的详细介绍: 字符测试函数...
void 指针详解(用法、注意事项等等) void 指针是一种特殊的指针类型,它可以指向任何类型的对象,但是它自身的类型是未知的。因此,void 指针不能进行自增操作,因为系统不知道它指的内容的大小。 void 指针的...
在Linux中,通过映射FrameBuffer设备到进程地址空间的方式来使用,如打开/dev/fb0设备,并通过mmap系统调用进行地址映射,然后使用memset函数清空屏幕。不过,这通常需要root权限来执行。FrameBuffer设备还提供了一...