【发布时间】:2015-06-15 20:54:46
【问题描述】:
考虑下面的 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);
}
if 分支中的 a 结构变量明显遮盖了 main 中的 a 结构变量。人们会认为 printf 中的输出是未定义的,但在 GCC 中,作用域变量似乎等于主变量。
例如
gcc test.c -o test
echo 10 | ./test
将输出 10。
另一方面,通过 clang 运行它,正如预期的那样
clang test.c -o test
echo 10 | ./test
输出 -2145248048。
这是 GCC 错误还是触发了某种未定义的行为?
gcc 4.8.2 铿锵3.4
【问题讨论】:
-
a在 main 处未初始化。没有意义。在 main 的顶层尝试s_t a = {77}; -
您可以通过 (a) 在
if语句的范围内打印a.x和 (b) 在main()的顶级范围内初始化a.x来改进您的测试, (c) 在if语句之前和之后打印a.x。这些步骤应该消除未定义的行为并使正在发生的事情更清楚。然后我们可以开始讨论您看到的内容以及是否存在错误。但是,虽然您的代码中有未定义的行为,但您无权投诉;任何事情都可能发生,这是调用未定义行为的有效结果。
标签: c gcc struct clang scoping