指向范围外变量的指针如何在C中表现?

时间:2016-12-19 15:31:42

标签: c pointers printf

我需要分析以下程序的输出:

#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。两个编译器再次产生相同的结果。

以下是我的问题:

  1. 原始答案是否正确?它是如何正确的?

  2. 评论printf的评论为何以及如何更改p的内容?或者我错过了这一点?

1 个答案:

答案 0 :(得分:1)

指针的值是不确定的,根据 6.2.4p2对象的存储持续时间引用该对象调用未定义的行为:

  

[...]如果在其生命周期之外引用对象,则行为未定义。当指向的对象到达其生命周期的末尾时,指针的值变得不确定。