3

谁能解释为什么第一种访问结构中的联合内的嵌套结构元素的方法有效而第二种方法无效?

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;
}
4

3 回答 3

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[] 指针,请 不要修改节点。如果在此之后尝试访问 child[] 数组,您将覆盖其中一个指针并泄漏该内存并崩溃。工会很棘手——最好避免这种安排。

于 2010-07-17T11:24:30.403 回答
1

您的问题与涉及 s 的事实没有太大union关系。

访问未初始化的指针只会给你随机行为。有时它确实有效,有时无效。对于您的第一次访问,可能只是幸运地发生在您访问的地方。

只需初始化,à la C99:

Node n = { .type = 0 };

或者

Node n = { 0 };

à la C89,而不是你的赋值语句。这具有将所有未提及的组件初始化为 0 的优点,因此您的指针。然后,您的测试代码应该从此愉快地进行段错误。

于 2010-07-17T11:54:34.160 回答
1

这些方法中的任何一种可以用于访问联合内的嵌套结构元素,这里的问题是您没有为 child[0] 或 child[1] 引用的节点分配内存。(我很惊讶你的“第一种方法”也没有失败。)

于 2010-07-17T11:20:36.933 回答