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
相关产品推荐
相关产品推荐

