指针和文字不变

时间:2013-08-08 17:30:46

标签: c++ pointers literals

我有一个代码不应该工作,但它的工作原理。你能告诉我为什么吗?

#include <iostream>

void f ( int** a, int b ) ;

int main (void) {

    int ** a ;
    a = new int* () ;  

    f(a,5) ;

    std::cout << **a << std::endl ;

    return 1 ;

}

void f ( int** a, int b ) {

    *a = &b ;

}

我声明一个指向名为a的指针的指针,我分配一个指向它的指针,然后我将它传递给f()。另一个f()参数是一个常量字面值,因此它应该在main()中没有分配静态内存,因此它应该在f()之后不存在。在f()内部,我将局部变量b的内存方向指向由f()复制的主指针上的指针,然后当main()执行f()所有本地时变量应该被删除然后继续,因此a应该指向垃圾,或者什么都没有, 但它不 并且指向5,值 已删除 b

真正发生了什么?为什么这段代码有效?

2 个答案:

答案 0 :(得分:3)

它似乎有效,但实际上并没有。

*指向堆栈上的地址。

当你打印** a时,acutaly打印的是堆栈上某个地址的内容。 (调用函数f时包含5的地址。)

但是,由于堆栈根据您的代码没有太大变化,因此值5仍然写在特定地址上,因此打印值为5。 如果你打电话给其他功能然后打印**你可能会得到不同的价值。

答案 1 :(得分:2)

在您的情况下,内存不会立即被覆盖。这是未定义的行为,并且它可能不会始终表现相同。每个编译器可能会以不同的方式对待它,您可能会在不同的平台上甚至在发布与调试模式中看到不同的结果。