memset的一些坑

memset是一个C标准库函数,在string.h中

void *memset(void *s, int ch, size_t n);

函数解释:将s中当前位置后面的n个字节用 ch 替换 ,返回s。

坑点:

替换时是按照单个字节赋值的。

也就是说每个字节是用取出ch的低字节,进行赋值。

对于int数组,比如int a[5]赋值memset(a,-1,sizeof(int )*5)与memset(a,511,sizeof(int )*5) 所赋值的结果是一样的都为-1;因为-1的二进制码为(11111111 11111111 11111111 11111111)而511的二进制码为(00000000 00000000 00000001 11111111)后八位都为(11111111)。

所以一般只用0和-1作为ch,不用其他值。

对于char数组,也是同理。

 

实验1:

int main(int argc, char *argv[])
{
int a[10];
memset(a, 2, sizeof(a));
int i;
for (i = 0; i< sizeof(a)/sizeof(a[0]); i++)
printf("%d\n", a[i]);
return 0;
}

发现a[i]的值都是33,686,018。

而33,686,018的二进制正是0000 0010 0000 0010 0000 0010 0000 0010.也就是4个0000 0010(也就是十进制的2)拼接起来。

 

实验2:

int main(int argc, char *argv[])
{
char a[10];
memset(a, '2', sizeof(a));
int i;
for (i = 0; i< sizeof(a)/sizeof(a[0]); i++)
printf("%c\n", a[i]);
return 0;
}

输出一堆2

 

posted @ 2020-11-05 21:12  乌蝇哥  阅读(316)  评论(0编辑  收藏  举报