Что происходит с объединением, так это то, что все определенные в нем объекты занимают одну и ту же память.И запрещается читать объект, отличный от последнего записанного.
В
union blah {
int bleh;
double blih;
char bloh[42];
};
union blah myobject;
myobject
содержит один из int
, double
или char[]
.И нет никаких указаний, какой из них является правильным.Программист должен хранить указание где-то еще:
int lastblahwrite; /* 0: int; 1: double; 2: char[] */
strcpy(myobject.bloh, "The quick brown dog");
lastblahwrite = 2;
, и позже его можно использовать как
switch (lastblahwrite) {
case 0: printf("%d\n", myobject.bleh); break;
case 1: printf("%f\n", myobject.blih); break;
case 2: printf("%s\n", myobject.bloh); break;
default: assert(!"this didn't happen"); break;
}
Вместо того, чтобы иметь две отдельные переменные, чтобы упростить управление, оноОбычно группируют само объединение и переменную-индикатор в структуру, как в вашем примере.
Управление все еще должно быть написано программистом.Нет ничего автоматического.