You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何更换指针类型会导致内存地址读取结果产生差异?

为什么更换指针类型后memset的输出结果差异巨大?

先明确memset的核心行为

memset是按单个字节进行赋值的标准库函数:它会把第二个参数转换成unsigned char,然后将目标内存区域的每一个字节都设置为该值。你调用memset(block1, 50, 10)的实际效果,是把block1起始的10个连续字节,每个都设为十六进制0x32(十进制50的十六进制表示)。


第一个代码的问题根源

你用int*类型指针操作内存,而绝大多数现代系统中int是4字节的固定长度类型:

  1. 你的循环逻辑是把int*强转为uint8_t*每次移动1字节,再转回int*去解引用——这意味着每次*iter读取的是当前地址开始的4个连续字节组成的完整int值,而非单个字节。
  2. 举个具体例子:
    • 起始地址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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:50:25