访问联盟内部结构内的点 - C.

时间:2013-07-31 07:23:08

标签: 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;
}

我正在尝试访问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;

有什么问题?

3 个答案:

答案 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_str指针
  • 未分配a-> b_str.c指针

由于未分配a-> b_str.c,当您想要访问它时,会发生段错误

编辑:

第二个猜测:你的init_a函数

  • 正在分配a_str指针
  • 正在分配a-> b_str.c指针
  • 正在初始化a-> c_str.i整数值

通过初始化c_str.i值,它会擦除​​b_str.c值,因为它共享相同的位置(它是一个联合)。

答案 2 :(得分:0)

如果已经初始化

,则需要检查指针“c”