memset辨析
之前一直对memset搞不清楚,只知道memset设置的值为0肯定没问题
今天就来啃一啃它
先贴源码
void* cb_memset(void* buffer, int b, size_t size){
assert(buffer!=NULL);
char* retAddr = (char*)buffer;
while (size-- > 0){
*(retAddr++) = (char)b;
}
return retAddr;
}
- 1.memset 的第一个参数是 char 类型的指针
所以如果是对 char 数组进行 memset 的话没什么问题,例如
char arr[10];
memset(arr,1,sizeof(char)*10);
- 2.当 memset 的第一个参数是 int 类型的指针时,就会有问题了,例如
int a[10];
memset(a, 1, sizeof(int)*10);
按照 memset 的源码走一遍,while 里每次循环写1个字节,1个 int 有4个字节,所以要写4次
例如a[0]会写成这样
内存内容 | 解释 |
---|---|
0000 0000 | a[0] 的第一个字节 |
0000 0001 | a[0] 的第二个字节 |
0000 0001 | a[0] 的第三个字节 |
0000 0001 | a[0] 的第四个字节 |
按照这样算来,a[0] = 1 ∗ * ∗ 224 + + + 1 ∗ * ∗ 216 + + + 1 ∗ * ∗ 28 + + + 1 ∗ * ∗ 20 = = = 16843009 (可以打印出来看看对不对)
从这点看来的话,如果第二个参数是 int 类型的指针的话,赋值为0是没问题的
赋值为-1呢
再来写一下
内存内容 | 解释 |
---|---|
1111 1111 | a[0] 的第一个字节 |
1111 1111 | a[0] 的第二个字节 |
1111 1111 | a[0] 的第三个字节 |
1111 1111 | a[0] 的第四个字节 |
按照这样算来,a[0] = 0xffffffff,也是 -1,所以赋值为 -1 也没问题
- 3.如果第二个参数超过了 char 的表示范围呢
*(retAddr++) = (char)b;
源码中有强制转换,所以当第一个参数为 char 类型指针,但第二个参数超出 char 范围的话,也得不到想要的结果。