访问联合内部结构内部的点-C
我有以下数据结构访问联合内部结构内部的点-C,c,pointers,unions,C,Pointers,Unions,我有以下数据结构 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; } 我正在尝试访问stru
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;
怎么了
struct a_str *a = init_a();
我猜:你的init_是一个函数
- 正在分配a_str指针
- 未分配a->b_str.c指针
- 正在分配a_str指针
- 正在分配a->b_str.c指针
- 正在初始化a->c_str.i整数值
通过初始化c_str.i值,它会删除b_str.c值,因为它共享相同的位置(它是一个并集)。如果指针“c”已初始化,则需要检查它是否已初始化。可能您没有为
init()
函数中的a->b_str c
分配内存,这可能是a->b_str.c
指向垃圾位置的原因,分段错误是由于访问未分配的内存-一个非法内存操作。如果
init()
函数是正确的,那么应该不会有任何问题(从语法角度看,您的代码是正确的)
下面我建议使用inti()
函数,该函数将为嵌套结构正确分配内存(请阅读注释)
下面是main()
代码,其中包含动态分配内存的解除分配/释放()步骤
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;
}
//假设内存分配和init是正常的
如果您遇到segfault,我将假设情况并非如此。请您也向我们展示一下init_a()
。推断是您的指针不是initialisedif您知道问题所在,您就不会发布此。。所以你不应该试图让我们认为你的代码的任何部分都是好的。因为您不知道坏代码是什么样子(否则您会看到它)正确,所以还可以添加一个免费代码(),因为OP的代码中可能存在内存泄漏。
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;
}