好的,这是我遇到的错误的精简变体。错误是我使用未初始化的变量初始化了一个数组。早些时候,我使用一个函数来声明元素的数量,但在清理之后我忘记了它,并将所有声明移到了函数的顶部。
我使用了标志-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 ?
最佳答案
GCC 接受 float a[n]
作为可变长度数组。但是,它应该警告您 n
在使用时包含垃圾。也许 VLA 初始化正在以某种方式重新排列,从而使代码生成器无法察觉这一事实?如果n
在使用之前被初始化,那么将对f()
的调用移到a
的声明之上显然是错误的,但是这个程序会产生undefined行为。
关于c - 当此代码中数组大小未初始化时,为什么 gcc o 不发出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47334540/