c - 当此代码中数组大小未初始化时,为什么 gcc o 不发出警告?

标签 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

最佳答案

GCC 接受 float a[n] 作为可变长度数组。但是,它应该警告您 n 在使用时包含垃圾。也许 VLA 初始化正在以某种方式重新排列,从而使代码生成器无法察觉这一事实?如果n在使用之前被初始化,那么将对f()的调用移到a的声明之上显然是错误的,但是这个程序会产生undefined行为。

关于c - 当此代码中数组大小未初始化时,为什么 gcc o 不发出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47334540/

相关文章:

javascript - 如何在 SQL 中保存 OFFSET 的当前状态

c - 在多线程环境中两个函数之间共享公共(public)变量

c - 替换字符串中的单词

c - 反转数组的函数 - C

c - 如何正确使用多维数组中的指针?

c - 不带 * 的指针打印值数组中的指针

arrays - 有没有办法将 2D 数组传递到 pthreads 函数中?

c++ - 如何为 FTP 实现二进制(TYPE I)

c - 用C语言从M68k ram地址中获取特定字节

gcc - 编译PJSIP示例