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
相关产品推荐
相关产品推荐

