保持指向变量的指针超出范围是否安全?

kun*_*ami 12 c pointers

示例代码:

#include <stdio.h>
int main (){
    int *p;
    {
        int v = 1;
        p = &v;
    }
    printf("%d\n", *p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常,但我不确定是否保证v的地址将被保留.

Mer*_*ham 25

没有保证.

一旦v超出范围,根本不做任何事情(甚至通过指针)都被视为未定义行为.

与任何其他未定义的行为一样,仅仅因为它适用于一个操作系统,编译器,编译器版本,一天中的时间等,并不意味着它将适用于另一个.

  • 在这种特殊情况下,您可能还会注意到行为的差异,具体取决于编译器优化设置.同样,没有什么是一成不变的,因为C标准没有定义应该发生的事情. (3认同)

cdh*_*wie 8

要添加Merlyn的答案,一个可能导致您不想要的行为的情况如下:

#include <stdio.h>
int main (){
    int *p;
    {
        int v = 1;
        p = &v;
    }
    {
        int w = 2;
        printf("%d\n", w);
    }
    printf("%d\n", *p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译器可以通过在堆栈上具有vw共享相同的分配来优化它.同样,编译器也可能不会对此进行优化 - 这就是为什么没有定义在封闭块结束后使用指向变量的指针的行为.程序可能输出"2"和"1",或"2"和"2",或"2",这取决于使用的编译器和设置完全不同.

  • 你的最后一段错了.根据C99§6.8.5.3,"如果第1条是一个声明,它声明的任何标识符的范围是声明的剩余部分和整个循环,包括其他两个表达式"它是*不是*在余数的范围内主要的. (3认同)
  • @Matthew:我明白了.我从我的回答中删除了文字; 我很确定剩下的是正确的. (2认同)