我在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
也就是说,它们都始于存储变量u
的内存段的开头。
对于使用gcc版本5.3.0
和-std=c11
编译的这个C程序,上述内容是正确的:
#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
使用同一编译器将上述代码编译成C++11和C11,得到的输出结果相同。
但这是否是标准化行为?它是否未定义的行为?我能否在大多数C编译器上依赖这种行为?我是否也可以期望在C++编译器上得到这种行为?
union
的区别吧?如果你知道的话,列出许多不同之处! - Destructor