C语言-memset

本文详细解析了C语言中的memset函数,通过源码分析指出memset在不同情况下的工作原理。当memset用于char数组时没有问题,但用于int数组时,由于按字节填充,需要注意赋值的正确性。例如,memset设置为0或-1时,对于int数组能正常工作,但如果赋值超出char范围,则可能无法得到预期结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 0000a[0] 的第一个字节
0000 0001a[0] 的第二个字节
0000 0001a[0] 的第三个字节
0000 0001a[0] 的第四个字节

按照这样算来,a[0] = 1 ∗ * 224 + + + 1 ∗ * 216 + + + 1 ∗ * 28 + + + 1 ∗ * 20 = = = 16843009 (可以打印出来看看对不对)

从这点看来的话,如果第二个参数是 int 类型的指针的话,赋值为0是没问题的

赋值为-1呢

再来写一下

内存内容解释
1111 1111a[0] 的第一个字节
1111 1111a[0] 的第二个字节
1111 1111a[0] 的第三个字节
1111 1111a[0] 的第四个字节

按照这样算来,a[0] = 0xffffffff,也是 -1,所以赋值为 -1 也没问题

  • 3.如果第二个参数超过了 char 的表示范围呢
*(retAddr++) = (char)b;   

源码中有强制转换,所以当第一个参数为 char 类型指针,但第二个参数超出 char 范围的话,也得不到想要的结果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值