如何使用指向指针的指针访问结构体中的指针成员?
问题分析与解决
你的代码触发段错误的核心原因是:仅为二级指针data分配了存储一级指针的内存,但这个一级指针(*data)并未指向有效的mystruct实例,属于野指针。访问野指针的成员必然引发内存访问错误。
修正要点
- 给二级指针
data分配内存后,必须再为*data(一级指针)分配mystruct结构体实例的内存,让它指向合法的结构体对象。 - 修正
main函数的标准写法(C标准规定main返回类型为int,第二个参数是字符指针数组)。
修正后的代码
#include <stdlib.h> #include <stdio.h> // 需包含头文件才能使用printf typedef struct { int *member; } mystruct; int main(int argc, char *argv[]) { mystruct **data; // 分配存储mystruct*的内存空间 data = (mystruct**)malloc(sizeof(mystruct*)); // 分配mystruct实例的内存,让*data指向该实例 *data = (mystruct*)malloc(sizeof(mystruct)); int c = 5; // 此时*data是有效的结构体指针,可安全访问member成员 (*data)->member = &c; printf("Member: %d\n", *((*data)->member)); // 释放动态分配的内存,避免内存泄漏 free(*data); free(data); return 0; }
简化写法(使用栈上结构体)
如果不需要动态分配结构体,也可以用栈上的结构体来简化逻辑,避免内存管理的麻烦:
#include <stdio.h> typedef struct { int *member; } mystruct; int main(int argc, char *argv[]) { mystruct s; mystruct **data = &s; // 二级指针指向栈上的结构体指针 int c = 5; (*data)->member = &c; printf("Member: %d\n", *((*data)->member)); return 0; }
内容的提问来源于stack exchange,提问作者hoang15nguyen
相关产品推荐
相关产品推荐

