为何更换指针类型会导致内存地址读取结果产生差异?
为什么更换指针类型后memset的输出结果差异巨大?
先明确memset的核心行为
memset是按单个字节进行赋值的标准库函数:它会把第二个参数转换成unsigned char,然后将目标内存区域的每一个字节都设置为该值。你调用memset(block1, 50, 10)的实际效果,是把block1起始的10个连续字节,每个都设为十六进制0x32(十进制50的十六进制表示)。
第一个代码的问题根源
你用int*类型指针操作内存,而绝大多数现代系统中int是4字节的固定长度类型:
- 你的循环逻辑是把
int*强转为uint8_t*每次移动1字节,再转回int*去解引用——这意味着每次*iter读取的是当前地址开始的4个连续字节组成的完整int值,而非单个字节。 - 举个具体例子:
- 起始地址
0x14e008800开始的4个字节都是0x32,按小端序(x86架构默认)组合成的int值是0x32323232,转换成十进制就是842150450,和你看到的输出完全一致。 - 到地址
0x14e008807时,只有前3个字节是0x32,第4个字节是malloc分配内存的初始值(通常为0),组合成的int值是0x00323232,对应十进制3289650。 - 最后一个地址
0x14e008809,只有第一个字节是0x32,后面三个字节为0,组合成的int值是0x00000032,对应十进制50。
- 起始地址
第二个代码符合预期的原因
你改用了uint8_t*类型指针:
uint8_t是标准定义的1字节无符号整数类型,解引用*iter时只会读取当前地址对应的单个字节。- 循环每次移动1字节,正好遍历memset设置的10个字节,每个字节的值都是
0x32(十进制50),因此输出全部符合预期。
核心结论
差异的本质是指针类型决定了解引用时读取的字节数:
int*解引用读取4字节,会把多个memset设置的字节组合成一个大整数;uint8_t*解引用读取1字节,正好对应memset单个字节的赋值结果。
内容的提问来源于stack exchange,提问作者FafaDog
相关产品推荐
相关产品推荐

