我一直认为当我在堆栈上声明一个大小由变量或参数提供的数组时,应该会出现错误。
然而,我发现如果我不显式初始化数组(是的,它不会在堆栈上,但我想知道缺少错误的原因)。
例如,以下代码由于array2而无法编译:
#define N 30
void defineArrays(int n)
{
int i,j;
int array1[N] = {};
int array2[n] = {};
for(i=0; i<N; ++i) array1[i] = 0;
for(j=0; j<n; ++j) array2[j] = 0;
}
但是以下代码可以编译和运行,即使我从主函数发送一个真正的n:
#define N 30
void defineArrays(int n)
{
int i,j;
int array1[N] = {};
int array2[n];
for(i=0; i<N; ++i) array1[i] = 0;
for(j=0; j<n; ++j) array2[j] = 0;
}
我在这里缺少什么?是将array2声明为指针吗?我正在使用gcc。
更新:感谢所有回答的人。问题确实是我的gcc版本出了一些奇怪的问题,默认情况下使用C99(或许不太奇怪,也许只是我太老了),而我错误地认为它默认使用C90,除非我告诉它使用其他版本。