You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:01:47