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

时间:2017-12-14 05:22:31

标签: 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]);
}  

代码用&#34; gcc var_array.c -o var_array&#34;编译。在linux操作系统中命令但是当我运行它时,我得到分段错误错误

Enter array size:
5
Segmentation fault  

我做错了什么?

2 个答案:

答案 0 :(得分: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;
      ...

您使用的是未初始化的变量。然后根据访问阵列的新值eof n。索引最有可能从数组的边界索引,给出了seg错误。

输入int8_t时使用scanf("%" SCNd8, &n);。您也可以输入int8_t类型。

是必须检查scanf的返回值。

所以理想的电话会是

if( scanf("%d",&n) == 1 ){
   //...success..do work
}

答案 1 :(得分:1)

程序中的错误是

int8_t n;                  //Here n is declared where n has random value
int8_t var_array[n];       /*Now in this statement you have declared array
                             with the size of that random value*/

所以你得到了这个错误,为了纠正你必须得到n的输入值,然后你声明var_array[n]