当我们覆盖C中的并集字段时会发生什么?

时间:2019-05-23 16:41:39

标签: c pointers unions

我正在阅读Thompson algorithm的实现以匹配C中的正则表达式。我看到了以下代码段:

typedef union Ptrlist Ptrlist;

/*
 * Since the out pointers in the list are always 
 * uninitialized, we use the pointers themselves
 * as storage for the Ptrlists.
 */
union Ptrlist
{
    Ptrlist *next;
    State *s;
};

/* Create singleton list containing just outp. */
Ptrlist*
list1(State **outp)
{
    Ptrlist *l;

    l = (Ptrlist*)outp;
    l->next = NULL;
    return l;
}

但是据我了解,在union类型中,所有字段共享相同的内存。那么为什么要在投射l->next=NULL之后再设置l=(Ptrlist*)outp;,因为这样做,我们将内存位置设置为NULL,而l会变成NULL

1 个答案:

答案 0 :(得分:4)

  

但是据我了解,在union类型中,所有字段共享相同的内存。

是的

  

那么为什么我们在投射l->next=NULL之后设置l=(Ptrlist*)outp;因为   这样,我们将该存储位置设置为NULLl将变为   NULL

否。

您似乎在将l(指向的指针 指向PtrList)与它指向的PtrList对象混淆了。尽管l->next指定的对象与l不同,但是两者均具有类型PtrList *。设置前者的值不会影响后者的值。