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

C语言中为何sizeof(max)输出4字节?宏未占用内存却有此结果

为什么sizeof(max)是4字节而sizeof(a)是1字节?

先看你给出的代码:

#include <stdio.h>
#define max 'A'
int main() {
    char a;
    printf("max[%d] sizeof[max][%ld]\n", max, sizeof(max));
    a = max;
    printf("a[%d] sizeof[a][%ld]\n", a, sizeof(a));
    return 0;
}

运行输出:

max[65] sizeof[max][4]
a[65] sizeof[a][1]

这个现象的核心原因其实和宏的工作机制,以及C语言里字符常量的类型有关,我给你拆解一下:

  • 宏是纯文本替换,没有自身的类型:#define max 'A'在预编译阶段会把代码里所有的max直接替换成'A',所以sizeof(max)本质上是sizeof('A')——宏只是替换文本,编译后根本不存在这个"宏变量",所谓"宏不占内存"指的就是这个阶段的特性。

  • C语言中字符常量的类型是int:这是很多人容易和C++搞混的点!在C里,像'A'这样的字符常量,它的类型不是char,而是int。所以sizeof('A')等价于sizeof(int),而在绝大多数现代系统中,int的大小是4字节,这就是sizeof(max)输出4的原因。

  • char变量的大小固定为1字节:变量a被声明为char类型,不管它存储的是什么值,sizeof(a)都会返回char类型的标准大小(1字节)。而a = max其实是把'A'这个int类型的65(ASCII码值)赋值给char类型的a,这里会发生隐式类型转换,把int转成char,但存储的数值还是65,所以printf输出的数值和max一致,但大小不同。

这样是不是就把逻辑理清楚啦?

内容的提问来源于stack exchange,提问作者Sunny Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:40:31