访问struct中的union中的变量

时间:2010-07-17 11:15:52

标签: c struct unions

任何人都可以解释为什么在结构中的联合内部访问嵌套结构元素的第一种方法有效,而第二种方法没有?

typedef struct element Node;
struct element
{
    int type;
    union
    {
        int value;
        Node *child[2];
    } u;
};
int main()
{
    Node n;
    Node *p;    
    n.type = 0;
    p = n.u.child[0];
    p->type = 10;  // 1st method
    (n.u.child[1])->type = 24;   // 2nd method
    return 0;
}

3 个答案:

答案 0 :(得分:2)

尝试以下方法:

int main()
{
    Node n;
    Node *p;    
    n.type = 0;

    // allocate memory for child nodes
    n.u.child[0] = (Node *)malloc(sizeof(Node));

    if (n.u.child[0] == NULL)
    {
        return 1;
    }

    n.u.child[1] = (Node *)malloc(sizeof(Node));

    if (n.u.child[1] == NULL)
    {
        free(n.u.child[0]);
        return 1;
    }

    p = n.u.child[0];
    p->type = 10;  // 1st method
    (n.u.child[1])->type = 24;   // 2nd method

    // release dynamically allocated memory
    free(n.u.child[0]);
    free(n.u.child[1]);

    return 0;
}

注意:如果您已经分配了其子[]指针,请不要修改节点的n.u.value。如果在此之后尝试访问child []数组,您将覆盖其中一个指针并泄漏该内存并崩溃。工会很棘手 - 最好避免这种安排。

答案 1 :(得分:1)

这两个方法应该可以用于访问联合内部的嵌套struct元素,这里的问题是你没有为child [0]或child引用的节点分配内存[1]。 (我很惊讶你的“第一种方法”也不会失败。)

答案 2 :(得分:1)

你的问题与涉及union的事实没什么关系。

访问未初始化的指针只会为您提供随机行为。有时候它确实有效。对于您的第一次访问,可能恰好在您访问的地方发生了一些事情。

刚刚初始化,即C99:

Node n = { .type = 0 };

Node n = { 0 };

àlaC89, 而不是你的作业声明。这有利于将未提及的所有组件初始化为0,从而将指针初始化。然后你的测试代码应该在以后快乐地进行段落。