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

如何通过指针加法定位地址,修改该位置指针指向新地址(非下标赋值)

用指针加法定位地址并修改指针指向的实现方法

按照你要求的三个步骤,以下是标准的实现方式,同时修正了你示例代码中的未定义变量、类型转换不严谨等问题:

核心步骤

  • 创建定位用的指针变量change_ptr,将其绑定到目标指针数组的起始地址
  • 通过指针加法计算出要修改的指针所在的内存地址:指针数组中每个元素是int*类型,因此偏移量为sizeof(int*)的整数倍(比如要修改第2个元素,就偏移1倍的sizeof(int*))
  • 将计算得到的地址转换为对应类型的指针,再赋值使其指向新的目标地址

完整代码示例

#include <stdio.h>
#include <stdint.h>

int *ptr[5]; // 定义包含5个int类型指针的数组
int new_target = 2024; // 示例:新指针指向的目标数据

int main() {
    // 步骤1:创建定位指针,初始化为指针数组的起始地址
    void *change_ptr = ptr;

    // 步骤2:通过指针加法定位到ptr[1]的内存地址(偏移1个int*的大小)
    void *target_addr = change_ptr + sizeof(int*);

    // 步骤3:转换为指向int*的指针,修改其指向的内容为new_target的地址
    *(int**)target_addr = &new_target;

    // 验证修改结果
    printf("ptr[1]指向的值:%d\n", *ptr[1]); // 输出2024
    return 0;
}

关键注意事项

  • 偏移量的正确性:直接使用sizeof(int*)而非硬编码字节数,能保证代码在32位、64位等不同平台下的兼容性
  • 类型转换的必要性:void*类型无法直接解引用赋值,必须转换为int**(指向int*的指针),才能正确操作目标地址处的指针变量
  • 越界风险:必须确保指针加法后的地址属于目标数组的有效范围,否则会触发未定义行为

内容的提问来源于stack exchange,提问作者WhoAmIWhereAmIWhatIAmDoing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:30:55