memset()函数详解

来源:互联网 发布:arm linux gnu gcc 编辑:程序博客网 时间:2024/06/05 09:22

memset()函数最近总是用到,用来初始化数组的,以字节为单位,

包含于 #include<string.h> 头文件里,

声明是  memset (void*, int, size_t);


这样不直观,举例吧,比如你现在有 data[1000];这样的一个数组, 你把这个数组全部置0呢,就可以这样写


memset(data,0,sizeof(data));

第一个参数是数组名,第二个是把每个字节赋值多少,0就是每个字节置0 ,1就是置1  第三个就是数组大小啦,用sizeof(data)稳妥点,你要是用  data_length*sizeof(int) 也行,这个长度可以自己视情况而定


当然,这样的确很方便,但是最近却发现memset()的一个问题,


对于结构体,int, double, long long 都可以全部置0  但是如果你写下面这样的代码


memset(data,1,sizeof(data));for(i=0;i<10;i++){printf("%d ",data[i]);}

你就可以发现问题了,输出的结果是 



明明是赋值为1  为什么会变成 16843009 呢,  


实际上是因为  memset 是为字符串而准备的函数,它是将每个字节置为1  

如果是char a[1000] 没问题,但是int  data []  就 出现问题了,因为每个int 是4个字节 


每个字节置0 则每个数就是   00000001 00000001 00000001 00000001  

这个值就是  2^24 + 2^ 16 + 2^8 + 1 = 16843009


所以如果数组不是一个字节的话,memset() 更多的是用来 置0  和 -1 ,-1 是全部都是1  一个字节和4个字节也一样的,当然,如果是其他值的话用memset初始化则会不准确,


0 0
原创粉丝点击