C 为什么';此代码中未初始化数组大小时发出警告?
好的,这是我的一个bug的精简版本。错误在于我使用未初始化的变量初始化了一个数组。早些时候,我使用一个函数来声明使用函数的元素数,但在清理之后,我忘记了它,并将所有声明移到了函数的顶部 我使用了标志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
-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
。在优化阶段进行一些重构会让人困惑。