-1

我有以下数据结构

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;

怎么了?

4

3 回答 3

1

可能您没有a->b_str.cinit()函数中分配内存,这可能 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;
}
于 2013-07-31T07:34:45.113 回答
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 值,因为它共享相同的位置(它是一个联合)。

于 2013-07-31T07:27:47.383 回答
0

您需要检查指针“c”是否已初始化

于 2013-07-31T07:29:10.987 回答