Указатель союза - PullRequest
       42

Указатель союза

2 голосов
/ 10 мая 2019

Рассмотрим тип объединения ниже.

typedef union nodeTypeTag {
    nodeEnum nodeType; 
    ruleNode rule; 
    conNode cond; 
    actNode act; 
    exprNode expr; 
    litNode lit; 
} ASTnode;

, в котором nodeEnum - это enum, а ruleNode, conNode, actNode, exprNode, litNode - все типы структур.

Теперь предположим, что в моей основной функции я делаю это:

ASTnode * tmp;
tmp = (ASTnode *) malloc(sizeof(ASTnode)); 

и предполагаю, что у меня есть другая функция, которая принимает параметры:
myfun(conNode * conditions) Что произойдет, если япередать tmp этой функции?Это даст ошибку?Зачем?Будет ли это неявно изменить тип указателя?Я новичок в идее объединения типов.

Спасибо

1 Ответ

2 голосов
/ 10 мая 2019

Указатель на ASTnode (который union nodeTypeTag *) и указатель на conNode (struct *) несовместимы. И это определенно неправильно передавать одно вместо другого.

Стандарт гласит, что (C11 6.2.5 28):

Все указатели на типы конструкций должны иметь те же требования к представлению и выравниванию, что и другие. Все указатели на типы объединения должны иметь те же требования к представлению и выравниванию, что и другие. Указатели на другие типы не обязательно должны иметь одинаковые требования к представлению или выравниванию.

Но указатели на типы объединения и указатели на типы структуры не имеют одинаковых требований к представлению и выравниванию.

Также здесь уместно 6.5.7

Объект должен иметь свое сохраненное значение, доступное только через выражение lvalue, которое имеет один из следующих типов:
- тип, совместимый с эффективным типом объекта,
- квалифицированная версия типа, совместимого с эффективным типом объекта,

Попытка получить доступ к объекту типа conNode через несовместимый тип в myfun является нарушением вышеуказанного правила.

...