Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么';此代码中未初始化数组大小时发出警告?_C_Arrays_Gcc_Initialization_Compiler Warnings - Fatal编程技术网

C 为什么';此代码中未初始化数组大小时发出警告?

C 为什么';此代码中未初始化数组大小时发出警告?,c,arrays,gcc,initialization,compiler-warnings,C,Arrays,Gcc,Initialization,Compiler Warnings,好的,这是我的一个bug的精简版本。错误在于我使用未初始化的变量初始化了一个数组。早些时候,我使用一个函数来声明使用函数的元素数,但在清理之后,我忘记了它,并将所有声明移到了函数的顶部 我使用了标志-std=c99-Wall-Wextra-pedantic-O,通常gcc会在未初始化值之前警告正在使用的值,但在这种特定情况下,它没有警告。所以,我的问题是: 这是gcc中的一个错误,还是f(&n)可能以某种奇怪的方式对数组大小进行后期初始化 #include <stdio.h> vo

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

我使用了标志
-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;
}
#包括
空f(int*x){
*x=8;
}
内部主(空){
int n;
浮点a[n];//编译器应警告n可能包含垃圾
a[7]=3.1415;
printf(“%f\n”,a[7]);
f(&n);//删除此选项将导致编译器按预期发出警告
返回0;
}

编辑:它可能是?

GCC正在接受浮动a[n]作为可变长度数组。但是,它应该警告您,
n
在使用时包含垃圾。也许VLA初始化正在以一种使代码生成器不明显的方式重新安排?如果
n
在使用前已初始化,则将调用移动到
a
声明上方的
f()
显然是错误的,但此程序会产生未定义的行为。

在我看来像是一个bug。你是什么意思?我不清楚;从main中删除f(&n)会导致编译器捕获并警告n未初始化使用。是的,这听起来肯定像是编译器错误。假设您已初始化
intn=1;浮动a[n];f&n。在这种情况下,编译器显然需要在分配VLA后更新
n
。在优化阶段进行一些重构会让人困惑。