我需要分析以下程序的输出:
#include "stdio.h"
void foo(int **const p)
{
int j = 11;
*p = &j;
printf("%d ", **p);
}
int main()
{
int i = 10;
int *p = &i;
foo(&p);
printf("%d ", *p);
printf("%d ", *p);
}
我知道没有人真正这样写,但仍然如此。我希望它输出类似11 [garbage] [garbage]
的内容,但却发现答案是11 11 [undefined value]
。我决定旋转一下。
#include "stdio.h"
void foo(int **p)
{
int j = 11;
*p = &j;
printf("1:-");
printf("%d-", **p);
}
int main()
{
int i = 10;
int *p = &i;
foo(&p);
/* printf("2:-"); */
printf("%d-", *p);
printf("3:-");
printf("%d-", *p);
}
这将在我的平台上提供1:-11-11-3:-0-
(macOS 10.12.2,在Apple LLVM 8.0.0版(clang-800.0.42.1)和Homebrew gcc 6.2.0上进行了测试)。
如果我取消对printf("2:-");
行的评论,我会1:-11-2:-0-3:-0-
。第二个调用以不同方式打印p
。两个编译器再次产生相同的结果。
以下是我的问题:
原始答案是否正确?它是如何正确的?
评论printf
的评论为何以及如何更改p
的内容?或者我错过了这一点?
答案 0 :(得分:1)
指针的值是不确定的,根据 6.2.4p2对象的存储持续时间引用该对象调用未定义的行为:
[...]如果在其生命周期之外引用对象,则行为未定义。当指向的对象到达其生命周期的末尾时,指针的值变得不确定。