Dej*_*vić 3 c gcc struct clang scoping
考虑以下C程序
#include <stdio.h>
typedef struct s {
int x;
} s_t;
int main() {
int x;
s_t a;
scanf("%d", &x);
if (x > 0) {
s_t a;
a.x = x;
}
printf("%d\n", a.x);
}
Run Code Online (Sandbox Code Playgroud)
将a在If分支结构变量明确阴影的a主结构体变量.可以预期printf中的输出将是未定义的,但是对于GCC,范围变量似乎等于主变量.
例如
gcc test.c -o test
echo 10 | ./test
Run Code Online (Sandbox Code Playgroud)
将输出10.
另一方面,通过clang执行此操作,正如预期的那样
clang test.c -o test
echo 10 | ./test
Run Code Online (Sandbox Code Playgroud)
输出-2145248048.
这是一个GCC错误还是存在某种未触发的行为?
gcc 4.8.2 clang 3.4
正如其他人提到的那样,你正在阅读一个未初始化的局部变量,这是未定义的.所以,任何事都是合法的.话虽如此,这种行为有一个特殊原因:gcc尽可能多地在堆栈上重用变量(即,只要生成的代码可证明是正确的).您可以使用该-fstack-reuse选项进行微调.
要禁用堆栈重用:
gcc test.c -o test -fstack-reuse=none
echo 10 | ./test
4195808 # prints some random number.
Run Code Online (Sandbox Code Playgroud)
要为所有变量启用堆栈重用:
gcc test.c -o test -fstack-reuse=all #, or -fstack-reuse=named_vars
echo 10 | ./test
10 # prints 10, as it reuses the space on the stack.
Run Code Online (Sandbox Code Playgroud)
这在GCC代码生成选项中有完整记录.