访问联合内部结构内部的点-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->b_str.c未分配,当您想要访问它时,会发生SEGFULT

编辑:

第二个猜测:你的init_是一个函数

  • 正在分配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;
}