为何两种char数组定义场景下sizeof计算结果相同?
char数组sizeof计算结果的疑问解析
先看你给出的代码示例:
char string0[]= "0123456789"; // sizeof(string0)=11 char string1[11]="0123456789A"; // sizeof(string1)=11
首先纠正你对string1的理解错误:
- 当你显式声明
char string1[11]时,编译器会直接分配11字节的内存空间给这个数组,sizeof(string1)的结果就是数组的总长度11,和里面存的内容无关。这里初始化的"0123456789A"刚好是11个字符(10个数字+1个'A'),数组会被完全填满,没有额外的'\0'空间——这个数组并不是标准的C风格字符串,因为它末尾没有终止符。
再解释string0的情况:
- 当你用
char string0[] = "字符串字面量"这种方式声明数组时,编译器会自动根据字面量的长度推导数组的大小。字符串字面量"0123456789"包含10个数字字符,而C语言中字符串字面量默认会在末尾添加一个'\0'终止符,所以这个字面量实际占用11字节的内存。编译器会把string0的长度设置为11,刚好装下这10个字符加'\0',因此sizeof(string0)返回11。
核心要点:
sizeof计算的是数组整体的内存占用大小,和数组里是否包含'\0'、是不是字符串没有关系。对于char数组来说,结果就是数组的元素个数(因为每个char占1字节)。- 用字符串字面量初始化无长度声明的char数组时,数组长度会包含字面量自带的'\0';显式指定数组长度时,数组长度就是你指定的数值,初始化内容如果刚好填满数组,就不会有额外的'\0'位置。
内容的提问来源于stack exchange,提问作者Valerio
相关产品推荐
相关产品推荐

