0

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

3 回答 3

4

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

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

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

于 2012-04-24T10:50:41.910 回答
0

Replace

int array1[x]; 

with

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

so you allocate enough memory to have x elements contained in array1.

Do not forget to free the memory after, by adding

free(array1)

at the end of your program.

于 2012-04-24T08:47:19.160 回答
0

@Saurabh:尝试在 C99 标准中运行时播放“计算机”。你遇到了声明 int x。它有一些很大的垃圾价值。然后您读取具有较大值的数组声明-您尝试分配该值-堆栈内存不足-您出现段错误。相反,如果您先读取大小合理的 x 值,然后再读取数组分配,则可以在堆栈上分配内存。无论如何,这个 c99 功能很糟糕。改用 std::vector 。

于 2012-06-15T01:01:37.243 回答