【发布时间】:2016-05-17 12:01:01
【问题描述】:
以下是产生两种不同输出的最简单代码,
- 10(Turbo C 版本 3.0)
- 0(在线编译器ideone
代码
#include<stdio.h>
int main(){
int *j;
{
int i = 10;
j = &i;
}
printf("%d",*j);
}
这是另一个question on SO 所说的未定义行为的一部分吗?
根据引用的问题,
printf仅产生输出 10 因为没有其他程序/系统覆盖相同 一段记忆。
【问题讨论】:
-
你为什么使用旧的编译器 Turbo C?那个版本很老了,会产生与ideone后面使用的更现代的不同的结果吗?不仅如此,一个是89标准的,后来的版本是99标准的。
-
@t0mm13b - 虽然我同意鼓励使用更现代的编译器,但该代码会在所有 C 标准版本中产生未定义的行为。只有当行为在一个版本的 C 标准中未定义,而在另一个版本中定义良好时,编译器的年龄才有意义——这里不是这种情况。
-
在实践中,许多编译器会在函数入口处为范围内变量分配存储空间,并在函数退出时释放它,所以即使
i在循环结束时超出范围,存储空间也是仍然分配给它。但是,该行为不保证,不应依赖。您的代码中的行为确实是未定义的。