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

C语言中仅通过内存地址解引用结构体能否重构原结构体?

能否通过uintptr_t存储的结构体地址重构原结构体?

答案是可以,但得满足几个关键前提:

  • 你存在uintptr_t里的数值,必须是原结构体实例的有效内存地址,而且在你解引用指针的时候,这个结构体实例还没被销毁(比如栈上的结构体没出作用域,堆上的没被free)
  • 你的代码里必须有原结构体的完整定义——编译器得知道这个结构体里有哪些成员、每个成员占多大空间、内存怎么对齐,不然没法正确解析内存里的内容
  • 转换过程要符合C标准:先把uintptr_t转成对应结构体的指针类型,再解引用读取内容

举个实际代码例子:

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

// 原结构体的完整定义
struct User {
    int id;
    char name[20];
    float score;
};

int main() {
    struct User original = {1001, "Alice", 95.5};
    // 把结构体地址转成uintptr_t存起来
    uintptr_t saved_addr = (uintptr_t)&original;
    
    // 把整数转回结构体指针,再解引用
    struct User *restored = (struct User *)saved_addr;
    // 读取重构后的结构体内容
    printf("ID: %d, 姓名: %s, 分数: %.1f\n", restored->id, restored->name, restored->score);
    
    return 0;
}

另外要注意两个坑:

  • 如果编译环境变了(比如换了编译器、改了内存对齐的编译选项),结构体的内存布局可能跟着变,这时候用旧的结构体定义去解引用,读出来的内容会乱
  • 如果原结构体已经被销毁了,再去解引用指针属于未定义行为——程序可能直接崩,也可能读出一堆垃圾值,完全没意义

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:47:40