Я пытаюсь понять, что именно вы получаете от сервитута для выровненных переменных в C99:
Исключение из строгого правила псевдонимов в C из 6.5.2.3 Члены структуры и объединения
Дает ли это вам карт-бланш на приведение к этому союзу, если исходная запись была сделана через указатель на одну из выровненных структур, как показано ниже?
#include <stdio.h>
#include <stdlib.h>
struct Foo { char t; int i; };
struct Bar { char t; float f; };
union FooBar {
struct Foo foo;
struct Bar bar;
};
void detector(union FooBar *foobar) {
if (((struct Foo*)foobar)->t == 'F')
printf("Foo %d\n", ((struct Foo*)foobar)->i);
else
printf("Bar %f\n", ((struct Bar*)foobar)->f);
}
int main() {
struct Foo *foo = (struct Foo*)malloc(sizeof(struct Foo));
struct Bar *bar = (struct Bar*)malloc(sizeof(struct Bar));
foo->t = 'F';
foo->i = 1020;
detector((union FooBar*)foo);
bar->t = 'B';
bar->f = 3.04;
detector((union FooBar*)bar);
return 0;
}
Обратите внимание, что во втором вызове t
было записано как "bar's t", но затем, чтобы определить, к какому типу оно относится, детектор считывает его как "foo's t"
Моя реакция, исходящая от C++, будет заключаться в том, что вы сможете сделать это только в том случае, если вы «в первую очередь выделили это как объединение FooBar». Мне нелогично представлять это как законное, но для динамических распределений в C такого нет. Итак, если вы не можете этого сделать, что именно вы можете сделать с динамическим выделением памяти, таким как выше, в этом исключении?
malloc
& friends в C илиvoid *
в/из других указателей вообще. - person too honest for this site   schedule 25.11.2015