为什么gcc o在此代码中未初始化数组大小时会发出警告?

时间:2015-10-20 17:52:28

标签: c arrays gcc initialization compiler-warnings

好的,所以这是我所拥有的一个错误的精简版本。错误是我使用未初始化的变量初始化了一个数组。之前我使用函数来声明使用函数的元素数量,但是在清理之后我忘了它并将所有声明移到函数的顶部。

我使用了标志-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

1 个答案:

答案 0 :(得分:1)

GCC接受float a[n]作为可变长度数组。但是,它应警告您n在使用时包含垃圾。也许VLA初始化正在重新排列,使得这个事实对代码生成器不明显?如果在使用前初始化了n,那么将调用移到f()以上a的声明显然是错误的,但此程序会产生未定义的行为。