You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中能否使用变量作为数组长度进行声明?

C语言变量作为数组长度的合法性及示例代码问题分析

变量作为数组长度的语法合法性

  • C89/ANSI C标准:不支持,数组长度必须是编译期可确定的常量表达式。
  • C99标准:正式引入*变长数组(VLA, Variable-Length Array)*特性,允许用运行期才能确定值的变量作为数组长度,该类数组在栈上分配,生命周期和普通局部数组一致。
  • C11及后续标准:将变长数组调整为可选实现特性,不是所有编译器都必须支持,比如微软的MSVC编译器就始终未支持该特性,跨平台场景要谨慎使用。

你提供的代码存在的问题

  • 未初始化变量就使用:你在size还未赋值、存储的是随机垃圾值的时候,就直接用它作为长度声明数组int arr[size],此时数组长度完全不可控,属于标准未定义行为。即使要使用变长数组,也必须先给size赋合法值,再声明数组。
  • scanf使用错误:scanf("%d",arr[size])存在两处错误:
    1. scanf要求传入目标变量的地址来存储输入值,你这里传入的是arr[size]这个元素的取值,类型不匹配;
    2. 此时size还是未初始化的随机值,访问arr[size]本身就是数组越界的未定义行为。
      正确的写法是先读取size的值:scanf("%d", &size);,建议额外增加输入合法性校验,比如判断输入的size是否为大于0的正整数。
  • 多处数组越界:
    1. 数组下标从0开始计数,长度为size的数组合法下标范围是0 ~ size-1,所有访问arr[size]的操作都是越界访问;
    2. for循环的终止条件写为i<=size,会导致循环多执行一次,访问到arr[size]这个非法位置,正确的条件应为i < size。
  • 逻辑实现错误:
    1. 你从来没有给数组的各个元素赋值,后续打印的内容都是内存里的随机垃圾值;
    2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:15:00