Microsoft Visual C++ 6.0中sizeof(&arr)输出异常的原因分析
VC6与GCC中
sizeof &arr的行为差异解析 测试代码
#include "stdafx.h" int main(int argc, char* argv[]) { int arr[5] = {1,2,3,4,5}; printf("%d\n", sizeof &arr); printf("%d\n", sizeof(&arr)); return 0; }
不同编译器的运行结果
Visual C++ 6.0输出
20 20
GCC(32位环境)输出
4 4
问题分析
首先明确&arr的类型:arr是int[5]类型的数组,取地址&arr后得到的是指向5个int的数组指针,类型为int (*)[5]。根据C/C++标准,sizeof操作符对指针类型求值,结果是当前平台的指针大小(32位系统中为4字节,64位系统中为8字节)。
GCC的行为完全符合标准,而VC6的输出明显错误——它把sizeof &arr错误解析成了sizeof arr,也就是整个数组的字节大小(5个int,每个4字节,总计20)。这是VC6的编译器BUG,属于早期编译器对数组指针类型的sizeof处理逻辑失误。
汇编层面验证
VC6生成的关键汇编代码(简化)
VC6在处理sizeof &arr时,直接将数组的字节大小作为常量传入printf:
push 14h ; 14h是十六进制的20,对应数组总大小 push offset string "%d\n" (0042201c) call printf
这里完全没有区分&arr的指针类型,直接使用了数组的长度常量,说明编译器错误地将&arr的sizeof等同于数组本身的sizeof。
GCC生成的关键汇编代码(简化)
GCC则正确识别了&arr的指针类型,传入的是指针大小:
pushl $4 ; 32位系统下指针大小为4 pushl $.LC0 call printf
这里明确传入了指针的字节大小,符合标准对指针类型sizeof的定义。
内容的提问来源于stack exchange,提问作者Black phoen1x
相关产品推荐
相关产品推荐

