在C语言中,如何通过int变量存储的结构体地址解引用结构体?
从存储在int变量的地址访问结构体的实现方法
首先明确前提:直接用int存储指针地址存在兼容性风险——64位系统中int一般是32位,而指针是64位,存进去会截断地址导致后续访问出错。更安全的做法是用标准库的intptr_t(需包含<stdint.h>),不过先按你当前用int的需求给出实现步骤。
示例结构体定义
先假设你有这样的结构体:
#include <stdio.h> typedef struct { int id; char name[20]; } MyStruct;
步骤1:将结构体地址存入int变量
把结构体实例的地址强制转换为int类型后存入变量:
// 创建一个结构体实例 MyStruct user = {1001, "Bob"}; // 存储地址到int变量x int x = (int)&user;
步骤2:将int转换为结构体指针
把存储地址的int变量强制转换为对应结构体的指针类型:
MyStruct *user_ptr = (MyStruct *)x;
步骤3:访问结构体成员
可以通过指针的->运算符直接访问成员,或者解引用指针后用.运算符访问:
// 用->访问(更常用) printf("用户ID:%d\n", user_ptr->id); printf("用户名:%s\n", user_ptr->name); // 解引用后用.访问,效果一样 printf("用户ID:%d\n", (*user_ptr).id);
完整可运行代码
#include <stdio.h> // 若使用安全的intptr_t,需添加下面这行 // #include <stdint.h> typedef struct { int id; char name[20]; } MyStruct; int main() { MyStruct user = {1001, "Bob"}; int x = (int)&user; MyStruct *user_ptr = (MyStruct *)x; printf("通过存储在int的地址访问结构体:\n"); printf("ID:%d\n", user_ptr->id); printf("Name:%s\n", user_ptr->name); // 更安全的写法(用intptr_t) // intptr_t x_safe = (intptr_t)&user; // MyStruct *user_ptr_safe = (MyStruct *)x_safe; // printf("安全写法访问:ID=%d, Name=%s\n", user_ptr_safe->id, user_ptr_safe->name); return 0; }
重要提醒
- 兼容性问题:64位系统下
int的宽度不足以存储完整指针地址,必须用intptr_t(C标准定义的专门用于存储指针的整数类型)来替代int,否则会出现地址截断,导致指针指向非法内存。 - 地址有效性:必须确保
int变量里存储的确实是有效的结构体实例地址,否则访问会触发未定义行为(比如程序崩溃、输出乱码)。
内容的提问来源于stack exchange,提问作者Kamlesh Kumar
相关产品推荐
相关产品推荐

