为什么访问可变长度数组元素时此代码崩溃?

问题描述

如果我要给出10个元素,则将how_many扫描为10。

但是,一旦我输入第三个值,程序就会崩溃并返回一些长负值。我不知道问题出在哪里。

int main()
{
    int how_many,k;
    int data[how_many];

    printf("Enter the number of values to be sorted..: ");
    scanf("%d",&how_many);
    printf("Enter the values one by one..:\n");

    for (k=0;k<how_many;k++)
    {
        scanf("%d",&data[k]);
        printf("data[%d]=%d\n",k,data[k]);
    }

    return 0;
}

解决方法

定义int data[how_many]时,变量how_many仍未初始化。

仅在之后定义arrey,即可从用户那里获得该值,但前提是scanf成功且该值为正。

int how_many,k;

printf("Enter the number of values to be sorted..: ");
if ( scanf("%d",&how_many) && how_many > 0 )
{
    int data[how_many];
    /* ... */
}

但是VLA(可变长度数组)有点危险:如果用户插入2000000000怎么办?您还必须检查一个合理的最大值:

#define MAX 1000

/* ... */

if ( scanf("%d",&how_many) && how_many > 0 && how_many <= MAX )
{
    int data[how_many];
    /* ... */
}

这就是为什么自C11起已从标准中删除VLA的原因,在这种情况下它不是最佳选择。我建议只是静态定义数组

 int data [MAX];

或动态:

int *data = malloc ( MAX * sizeof( int ) );

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...