[英]Why doesn't gcc o warn when size of array is uninitialized in this code?
好的,这是我所遇到的一个错误的精简版本。 错误是我使用未初始化的变量初始化了数组。 早些时候,我使用函数来声明使用函数的元素数量,但是在清理之后,我忘记了它,并将所有声明移至函数顶部。
我使用了标志-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;
}
编辑:可能是这个gcc错误 ?
GCC接受float a[n]
作为可变长度数组。 但是,它应该警告您n
在使用时包含垃圾。 也许VLA初始化正在以某种方式重新排列,使得该事实对于代码生成器而言不是显而易见的? 如果n
在使用前进行初始化,移动电话,以f()
的声明,上面a
显然是错误的,但这个方案将产生不确定的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.