变长数组和分段错误

Kaw*_*iKx 0 c arrays variable-length

在下面的代码中,如果我在扫描数组“x”的所需长度之前声明可变长度数组“int array1[x]”,则会在执行时收到“分段错误(核心转储)”。(编译没有错误)。我在编译时使用选项 -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);
}
Run Code Online (Sandbox Code Playgroud)

pmg*_*pmg 5

在下面的代码中,如果我在扫描数组“x”的所需长度之前声明可变长度数组“int array1[x]”,则会在执行时收到“分段错误(核心转储)”。

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

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