C语言数组声明长度可否为非常量?ANSI C语法合法性咨询
关于C语言数组声明合法性的解答
好问题!咱们来把这个疑问拆解清楚,结合不同C标准的规则来分析:
首先明确你的核心问题:int my_array[sizeof(int) * 5]; 这个声明是否合法?以及ANSI C(也就是C89/C90标准)中数组长度是否必须是常量表达式?
1. ANSI C(C89/C90)的规则
在ANSI C标准中,固定长度数组(包括全局数组、static局部数组,以及普通局部自动数组)的长度必须是整数常量表达式——也就是能在编译阶段就确定数值的表达式。
那sizeof(int) * 5属于整数常量表达式吗?答案是肯定的:
sizeof(int)的结果是编译期就能确定的整数值(比如在32位系统上是4,64位系统上是4或8),属于标准定义的整数常量表达式范畴;- 用这个值乘以5,得到的依然是编译期可确定的常量,完全符合ANSI C对数组长度的要求。
所以在ANSI C中,int my_array[sizeof(int) * 5];是合法的。
2. C99及后续标准的规则
从C99开始,C语言引入了**变长数组(VLA)**特性,允许使用运行时才能确定数值的表达式来定义局部数组的长度(比如int n = 10; int arr[n];)。
不过回到你的例子,sizeof(int) * 5依然是编译期常量,所以不管是否启用VLA特性,这个数组声明都是合法的——它既可以被当作固定长度数组处理,也完全符合VLA的规则(毕竟常量表达式是运行时表达式的子集)。
额外补充:和你已知声明方式的对比
你提到的几种合法声明:
int a[20];:用字面常量作为长度,属于典型的常量表达式声明,在所有C标准中都合法;int b[] = {32, 431, 10, 42};:编译器自动根据初始化列表的元素个数推导数组长度,这是C标准允许的语法,和常量表达式规则不冲突;int *c = calloc(15, sizeof(int));:这是动态内存分配,本质上是创建一个指向堆内存的指针,和栈上的数组声明是不同的内存分配方式,不受数组长度规则的限制。
内容的提问来源于stack exchange,提问作者Vlad Havriuk
相关产品推荐
相关产品推荐

