变长阵列和分段故障

时间:2012-04-24 08:42:46

标签: c arrays variable-length

在下面的代码中,如果我在扫描数组'x'的所需长度之前声明变长数组'int array1 [x]',我会在执行时收到'segmentation fault(core dumped)'。 (编译没有错误)。我在编译时使用选项-std = c99严格使用ANSI C99标准。

我的问题是为什么我不能将所有声明放在一起?

// code to find a minimum value in a variable-length array
#include<stdio.h>

int minval(int [], int); 

int main(void)
{
    int x, i;

    int minivalue;

    printf("Enter the total number of array elements you wish to define?");
    scanf("%i",&x);

    int array1[x];          

    printf("Enter the elements now:");
    for (i = 0; i < x; i++)
        scanf("%i",&array1[i]);

    minivalue = minval(array1, x);

    printf("\nMinimum value in the array is = %i\n",minivalue);

    return 0;
}

int minval(int array2[], int x)     
{
    int i;
    int minivalue;

    minivalue = array2[0];

    for (i=0; i < x; i++){
        if (minivalue > array2[i])
            minivalue = array2[i];  
    }

    return (minivalue);
}

3 个答案:

答案 0 :(得分:4)

  

在下面的代码中,如果我在扫描数组'x'的所需长度之前声明可变长度数组'int array1 [x]',我会在执行时收到'segmentation fault(core dumped)'。

您不能声明具有未初始化值的可变长度数组。

int array1[x]之前移动scanf()时,x没有有效值。

答案 1 :(得分:0)

替换

int array1[x]; 

int* array1 = (int*) malloc (x * sizeof int);

所以你分配了足够的内存来让array1中包含x个元素。

添加

后,不要忘记释放内存
free(array1)

在你的课程结束时。

答案 2 :(得分:0)

@Saurabh:尝试在C99标准的运行时播放“计算机”。你遇到了声明int x。它有一些大的垃圾价值。那么你用大值读取数组声明 - 你试图分配 - 用尽堆栈内存 - 你会出错。相反,如果您首先读取x的值,然后是大小合理,然后是数组分配,则可以在堆栈上分配内存。无论如何,这个c99功能很糟糕。使用std :: vector代替。

相关问题