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
", 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
", a[i]);
return 0;
}
输出一堆2