我有以下数据结构
struct a_str {
union {
struct {
struct c_str *c;
} b_str;
struct {
int i;
} c_str;
};
}
struct c_str {
struct d_str;
}
struct d_str {
int num;
}
我正在尝试访问struct d_str中的num。出于某种原因,我继续遇到分段错误。
struct a_str *a = init_a(); //assume memory allocation and init is ok.
a->b_str.c->d_str.num = 2;
有什么问题?
答案 0 :(得分:1)
可能你没有在a->b_str.c
函数中为init()
分配内存,这可能是a->b_str.c
指向垃圾位置的原因,而分段错误是由于访问非内存已分配 - 非法的记忆操作
如果init()
函数是正确的,那么应该没有任何问题(语法方面你的代码是正确的)。
下面我建议inti()
函数将正确地为嵌套结构分配内存(读取注释)。
struct a_str *init()
{
struct a_str *ret = malloc(sizeof(struct a_str)); // memory for `struct a_str`
struct c_str *cptr = malloc(sizeof(struct c_str)); // memory for inner struct
ret->b_str.c = cptr; //assigning valid memory address to ret->b_str.c
return ret;
}
下面是main()
代码,其中包含deallocate / free()动态分配内存的步骤。
int main(int argv, char **argc)
{
struct a_str *ret = init();
ret->b_str.c->d.num = 5;
printf("%d\n", ret->b_str.c->d.num);
//Make sure to free the memory allocated through malloc
free(ret->b_str.c); // 1 first free in struct
free(ret); // in reverse order of allocation
return 0;
}
答案 1 :(得分:0)
struct a_str *a = init_a();
我猜:你的init_a函数
由于未分配a-> b_str.c,当您想要访问它时,会发生段错误
编辑:
第二个猜测:你的init_a函数
通过初始化c_str.i值,它会擦除b_str.c值,因为它共享相同的位置(它是一个联合)。
答案 2 :(得分:0)
如果已经初始化
,则需要检查指针“c”