好的,所以这是我所拥有的一个错误的精简版本。错误是我使用未初始化的变量初始化了一个数组。之前我使用函数来声明使用函数的元素数量,但是在清理之后我忘了它并将所有声明移到函数的顶部。
我使用了标志-std=c99 -Wall -Wextra -pedantic -O
,并且通常gcc会警告在未初始化之前使用的值,但在这种特定情况下它没有。所以,我的问题是:
这是gcc
或中的错误,f(&n)
是否可能以某种奇怪的方式对数组大小进行初始化?
#include <stdio.h>
void f(int * x) {
*x = 8;
}
int main(void) {
int n;
float a[n]; // Compiler should warn that n may contain garbage
a[7] = 3.1415;
printf("%f\n", a[7]);
f(&n); // Removing this causes the compiler warn as expected
return 0;
}
编辑:可能是this gcc bug?
答案 0 :(得分:1)
GCC接受float a[n]
作为可变长度数组。但是,它应警告您n
在使用时包含垃圾。也许VLA初始化正在重新排列,使得这个事实对代码生成器不明显?如果在使用前初始化了n
,那么将调用移到f()
以上a
的声明显然是错误的,但此程序会产生未定义的行为。