我正在阅读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
?
答案 0 :(得分:4)
但是据我了解,在
union
类型中,所有字段共享相同的内存。
是的
那么为什么我们在投射
l->next=NULL
之后设置l=(Ptrlist*)outp
;因为 这样,我们将该存储位置设置为NULL
,l
将变为NULL
?
否。
您似乎在将l
(指向的指针 指向PtrList
)与它指向的PtrList
对象混淆了。尽管l->next
指定的对象与l
不同,但是两者均具有类型PtrList *
。设置前者的值不会影响后者的值。