C - 可变长度数组和分段错误



在下面的代码中,如果我在扫描数组"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 = %in",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);
}

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

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

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

替换

int array1[x]; 

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

因此,您分配了足够的内存以使 X 元素包含在 array1 中。

不要忘记通过添加来释放内存

free(array1)

在您的程序结束时。

@Saurabh:尝试在C99标准中运行时播放"计算机"。 你遇到了声明int x。 它有一些大的垃圾值。 然后你读取带有大值的数组声明 - 你尝试分配它 - 耗尽堆栈内存 - 你 seg 错误。 相反,如果您首先读取大小合理的 x 值,然后读取数组分配, 您可以在堆栈上分配内存。无论如何,这个C99功能很糟糕。请改用 std::vector。

最新更新