У меня есть объединение в C, как это:
union AUnion {
struct CharBuf {
char *buf;
size_t len;
} charbuf;
uint8_t num;
double fp_num;
};
Мой вопрос в том, могу ли я гарантировать, что если дано следующее:
union AUnion u;
Тогда верно следующее:
&u == &u.num
&u == &u.fp_num
&u == &u.charbuf
I. все они начинаются в начале сегмента памяти, где хранится u
.
В случае этой C-программы, скомпилированной с gcc version 5.3.0
и -std=c11
, это верно:
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
union AUnion {
struct CharBuf {
char *buf;
size_t len;
} charbuf;
uint8_t num;
double fp_num;
};
int main(void)
{
union AUnion u;
printf("%d\n", ((void*)&u) == ((void*)&u.charbuf));
printf("%d\n", ((void*)&u.charbuf) == ((void*)&u.num));
printf("%d\n", ((void*)&u.num) == ((void*)&u.fp_num));
}
Как он печатает:
1
1
1
Компиляция кода выше как С++ 11 с тем же результатом компилятора в том же выпуске, что и компиляция C11.
Но это стандартизированное поведение? Это undefined? Могу ли я полагаться на это поведение с большинством компиляторов C? Могу ли я ожидать такого поведения с компиляторами С++?