【发布时间】:2012-05-04 21:21:15
【问题描述】:
在下面的代码中,如果我在扫描所需长度的数组“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);
}
【问题讨论】:
-
那不是有效的 C。我真的很惊讶它甚至可以编译。您需要使用动态内存分配(即
malloc)。 -
它编译并正常运行。我也使用 -std=c99 选项进行编译。
-
那么它要么是 GCC 扩展,要么是标准中的特殊情况(我怀疑是 GCC 扩展)。
-
@Corbin 但为什么它无效。标准规定变量可以在程序的任何地方声明,只要声明发生在变量第一次使用之前。
-
因为你不能用这样的变量声明一个数组。
int a[x]被视为无效。那是因为它依赖于动态分配。这是因为 x 的值在编译时是未知的。如果 x 的值在编译时已知,则它是有效的。我怀疑当你把它放在之后发生的事情是 GCC 扩展会自动将它转换为 Emanuele Bezzi 的答案。之前放置它时,GCC 会做同样的事情,除了x1没有初始化,因此 malloc 有可能出错。
标签: c arrays variable-length