如何在gcc中使用可变长度数组?

Kha*_*gdo -2 c gcc

所以,我在这个网站上看到c ++不允许变长数组但gcc允许它.所以,我想测试一个小代码

#include<stdio.h>
#include<stdint.h>

void main()
{
    int8_t n;
    int8_t var_array[n];
    int8_t i;
    printf("Enter array size: \r\n");
    scanf("%d", &n);

    for(i=0; i<n; i++)
        var_array[i] = i;

    for(i=0; i<n; i++)
        printf("var_array[%d] = %d\r\n", i, var_array[i]);
}  
Run Code Online (Sandbox Code Playgroud)

代码在linux OS中用"gcc var_array.c -o var_array"命令编译但是当我运行它时,我得到分段错误错误

Enter array size:
5
Segmentation fault  
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

use*_*738 5

也可以int使用%d说明符.(因为早期只有8位,如果值很大,可能会溢出)

    int n;
    int i;
    printf("Enter array size: \r\n");
    if( scanf("%d", &n) != 1 ){
        fprintf(stderr,"%s\n","Error in input");
        exit(1);
    }
    int var_array[n];
    for(i=0; i<n; i++)
        var_array[i] = i;
      ...
Run Code Online (Sandbox Code Playgroud)

您正在使用未初始化的变量.然后基于n访问阵列的新值eof .索引最有可能从数组的边界索引出来,给出了seg错误.

用于输入int8_t用途scanf("%" SCNd8, &n);.您也可以输入int8_t类型.

scanf必须检查是的返回值.

所以理想的电话会是

if( scanf("%d",&n) == 1 ){
   //...success..do work
}
Run Code Online (Sandbox Code Playgroud)