C语言中声明带初始值的数组,指定大小是否有用?两种写法有何区别?
C语言中两种数组声明方式的区别?
如下两种数组声明方式是否存在差异:
int someNumbersArray[] = {10, 20, 30};
和
int someNumbersArray[3] = {10, 20, 30};
我的推测是两者编译后的结果一致,或许后者的编译速度略快?我曾用包含10000个元素的数组测试,未发现差异。
补充说明:
- 声明数组时指定的大小过小会引发问题(我使用的编译器会发出警告);
- 我知晓可以声明带初始值且大小更大的数组,这种情况下显然必须指定所需的大小。
回答
1. 编译后结果完全一致
这两种声明方式编译后生成的目标代码、数组内存布局以及初始化后的状态完全没有区别。编译器处理第一种[]声明时,会自动统计初始化列表的元素个数,将数组大小设为3,和第二种显式指定[3]的效果完全相同。
2. 编译速度几乎无差异
你猜测“后者编译速度略快”并不成立。现代编译器处理这两种情况的逻辑复杂度基本一致:不管是显式指定大小还是自动推导,编译器都需要遍历初始化列表完成元素初始化,额外的“统计元素个数”操作对编译器来说开销微乎其微——哪怕是10000个元素的数组,这点计算量也可以忽略,所以你测试时没发现差异是正常的。
结合补充说明的细节
- 指定大小过小的问题:如果显式指定的数组大小小于初始化列表的元素个数(比如
int arr[2] = {10,20,30};),这属于违反C语言标准的行为,编译器通常会发出警告甚至直接报错(不同编译器处理细节有差异,但这种写法绝对不推荐)。 - 需要更大数组时必须指定大小:没错,如果你想要的数组大小比初始化列表元素数多(比如需要存5个int但只初始化前3个),就必须显式指定大小:
int arr[5] = {10,20,30};,此时剩下的2个元素会被自动初始化为0。如果用[],编译器会把数组大小推导为3,达不到你要的5个元素的需求。
内容的提问来源于stack exchange,提问作者Nicolas Sénave
相关产品推荐
相关产品推荐

