Что случилось, когда мы переопределяем поля объединения в C? - PullRequest
0 голосов
/ 23 мая 2019

Я читаю реализацию алгоритма Томпсона для сопоставления регулярного выражения в 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 Ответ

4 голосов
/ 23 мая 2019

Но, как я понимаю, в типе union все поля имеют одинаковую память.

Да.

Так почему мы можем установить l->next=NULL после приведения l=(Ptrlist*)outp; так как сделав это, мы установим эту ячейку памяти на NULL и l станет NULL

номер

Вы, похоже, путаете l, указатель на a PtrList с объектом PtrList, на который он указывает. l->next обозначает объект, отличный от l, хотя оба имеют тип PtrList *. Установка значения первого не влияет на значение последнего.

...