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

时间:2010-12-27 02:54:28

标签: c pointers

示例代码:

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

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

3 个答案:

答案 0 :(得分:25)

无法保证。

一旦v超出范围,任何事情(甚至通过指针)都会被视为Undefined Behavior

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

答案 1 :(得分: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;
}

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

答案 2 :(得分:0)

你有时会工作,但不能确定它是否有效......它有时不仅会导致 总线错误,但甚至可能导致整个程序崩溃...

我会给你一个例子

看看这个...... http://www.functionx.com/cpp/examples/returnreference.htm

这里他试图返回一个超出范围的变量的引用...(大错误)..但是它有效....

你不能保证..它更好(不是更好的)永远不会返回超出范围的数据的引用