64位系统下包含指针的union大小为何是4字节而非8字节?
问题原因解答
- 最核心的原因:你运行的是32位编译生成的程序,和你使用的硬件是不是64位没有直接关系。
64位硬件完全兼容运行32位程序,只要编译时指定生成32位目标,编译器就会按照32位规则处理类型长度:32位模式下int*指针的长度就是4字节,和int类型长度一致,而共用体的大小取所有成员的最大长度,自然最终结果就是4字节。
常见的触发场景包括:Windows平台下Visual Studio默认选择x86编译配置、GCC/Clang编译时加了
-m32参数、系统本身安装的就是32位版本的C编译器。 - 你可以新增一行代码验证当前编译环境的指针长度:
如果输出为4就可以确认当前是32位编译模式,要得到8字节的结果,只需要切换到64位编译配置即可:VS改选x64编译、GCC/Clang去掉printf("%zu\n", sizeof(int*));-m32参数替换为-m64。 - 额外提出现有代码的几处非标准/错误写法:
printf的格式化符使用错误,sizeof的返回值是无符号size_t类型,正确的格式化符是%zu,不要用%d;你写的\m是非法转义字符,换行应该用\nprintf语句末尾遗漏了分号,会直接导致编译报错void main()是非标准写法,标准C的主函数写法是int main(void),结束时需要返回整数值。
内容的提问来源于stack exchange,提问作者Nish animal69
相关产品推荐
相关产品推荐

