memeset 作用是将一段内存的数据全部设置为指定值,函数原型为:
void *memset(void *dest,int c,size_t count);
头文件:
使用时引入<memory.h>头文件
作用:
将dest指针指向的内存区域的前count个字符设置为c,并返回指向这个存储区的指针。
注意点1:memset按字节初始化内存区域
memset按字节对存储区进行初始化,所以参数c实际有效的只有低八位(即实际只取0~255),如下所示a与b设置为了相同值。
char a = ' ';
char b =' ';
memset(&a,65,1);
memset(&b,65+256,1);
正因如此,使用memset对int类型数组进行初始化时一般只能赋为0或-1(二进制码全0或全1),因为int类型占四字节,而memset是将内存区域的每一个字节设置为c的低八位。比如以下这种情况,a[0]~a[3]被设置为16843009,即0x01010101,int类型占四字节,每一字节都被设置成了0x01.
int a[] = {1,2,3};
memset(a,1,12);
for(int i=0;i<=2;i++)
printf("%d ",a[i]);
注意点2:count设置
- 若使用数组名可以使用sizeof()获取长度
int a[] = {0,1,2};
memset(a,1,sizeof(a));
- 当用数组名作为函数参数时,实际上传递的是一个指针,使用sizeof()只能获得指针变量的大小,32位机为4字节,64位机为8字节。这时应当把数组大小作为参数传递,如以下代码中再64位系统下,只能将a[0]和a[1]设置为-1.
void init(int *a)
{
memset(a,255,sizeof(a));
}
int main()
{
int a[] = {0,1,2};
init(a);
for(int i=0;i<=2;i++)
printf("%d ",a[i]);
}
- 注意对字符串初始化时可能会覆盖字符串结束符’\0’,导致printf(“s”)不能正确输出。printf(“%s”)会将目标区域的每一个字节按照字符类型输出,直至遇到字符串结束符。C/C++中,使用双引号定义字符串变量会在末尾自动追加结束符。如下所示,会输出8个A和乱码,因为字符串结束符被覆盖掉了。
char a[] = "abcdefg";
memset(a,65,8);
printf("%s",a);