memset函数
1.memset函数声明
memset函数的声明包含在<string.h>
中
其原型是:
void * memset ( void * ptr, int value, size_t num );
其作用是:
将从ptr所指的内存单元开始num个字节的值全部置为value,并返回ptr指针。
例如下面这段代码:
/* memset example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "almost every programmer should know memset!";
memset (str,'-',6);
puts (str);
return 0;
}
str[]的初始值为“almost every programmer should know memset!”,执行memset(str,’-‘,6)语句后,str[]的值为“—— every programmer should know memset!”。
实际验证一下:
gdb调试结果和实际运行结果都显示了正确的结果。
2.使用memset函数的误区
有人可能会想到,既然memset函数可以对多个字节设置相同的值,那么是否可以对数组进行初始化呢?结论是对于char数组是可以的,但是对于in或者其他类型数组是不行的。原因是memset函数是以字节为单位进行操作的,char数组的每个元素刚好都占用一个字节,而int数组或者其他类型数组则不然。
下面我们分别对char数组和int数组实验验证一下。
#include<stdio.h>
#include<string.h>
int main()
{
char a[10];
memset(a,'s',sizeof(a));
int i=0;
for(i=0;i<10;i++)
putchar(a[i]);
return 0;
}
从程序执行结果可以看到,memset函数确实将a数组的每一位均修改为‘s’了。
再看下一个例子,这次我们对int数组应用memset函数。
#include<stdio.h>
#include<string.h>
int main()
{
int a[10];
memset(a,0,sizeof(a));//value=0
int i;
for(i=0;i<10;i++)
printf("%d ",a[i]);
putchar('\n');
return 0;
}
运行结果:
看起来,好像memset函数也能对int数组进行初始化,a数组的值被全部设置为0了。我们再来改一下代码;
#include<stdio.h>
#include<string.h>
int main()
{
int a[10];
memset(a,1,sizeof(a));//value=1
int i;
for(i=0;i<10;i++)
printf("%d ",a[i]);
putchar('\n');
return 0;
}
运行结果:
本来要设置的值为1,为什么结果如此诡异,数组元素的值全部变成了16843009??
其实原因也很简单,前面我们已经说过,memset函数是以字节为单位进行操作的,而每一个int占了四个字节(机器不同,int的长度也有可能不同),因此,memset函数会将int元素的每一个字节的值设置为1,表示成二进制就是:
通过前面的两个例子,证明memset函数不能实现除char外类型数组的整体初始化。