C语言中能否使用变量作为数组长度进行声明?
C语言变量作为数组长度的合法性及示例代码问题分析
变量作为数组长度的语法合法性
- C89/ANSI C标准:不支持,数组长度必须是编译期可确定的常量表达式。
- C99标准:正式引入*变长数组(VLA, Variable-Length Array)*特性,允许用运行期才能确定值的变量作为数组长度,该类数组在栈上分配,生命周期和普通局部数组一致。
- C11及后续标准:将变长数组调整为可选实现特性,不是所有编译器都必须支持,比如微软的MSVC编译器就始终未支持该特性,跨平台场景要谨慎使用。
你提供的代码存在的问题
- 未初始化变量就使用:你在
size还未赋值、存储的是随机垃圾值的时候,就直接用它作为长度声明数组int arr[size],此时数组长度完全不可控,属于标准未定义行为。即使要使用变长数组,也必须先给size赋合法值,再声明数组。 scanf使用错误:scanf("%d",arr[size])存在两处错误:scanf要求传入目标变量的地址来存储输入值,你这里传入的是arr[size]这个元素的取值,类型不匹配;- 此时
size还是未初始化的随机值,访问arr[size]本身就是数组越界的未定义行为。
正确的写法是先读取size的值:scanf("%d", &size);,建议额外增加输入合法性校验,比如判断输入的size是否为大于0的正整数。
- 多处数组越界:
- 数组下标从0开始计数,长度为
size的数组合法下标范围是0 ~ size-1,所有访问arr[size]的操作都是越界访问; - for循环的终止条件写为
i<=size,会导致循环多执行一次,访问到arr[size]这个非法位置,正确的条件应为i < size。
- 数组下标从0开始计数,长度为
- 逻辑实现错误:
- 你从来没有给数组的各个元素赋值,后续打印的内容都是内存里的随机垃圾值;
- for循环里打印的是固定的
arr[size],而不是遍历到的arr[i],无法实现数组元素打印的预期。
修正后的参考代码
#include <stdio.h> int main () { int size,i; // 先读取数组长度 printf ("Enter size of array\n"); if (scanf ("%d", &size) != 1 || size <= 0) { printf("输入不合法,请输入正整数\n"); return 1; } // 长度赋值完成后再声明变长数组 int arr[size]; // 给数组元素赋值 for (i=0; i<size; i++) { arr[i] = i + 1; // 可根据需求调整赋值逻辑 } // 打印数组元素 for (i=0; i<size; i++) { printf ("%d ", arr[i]); } return 0; }
内容的提问来源于stack exchange,提问作者Aditya Parihar
相关产品推荐
相关产品推荐

