0

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

#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给指向 main 复制的指针的指针f(),然后在main()执行时f()应该删除所有局部变量然后继续,所以a应该指向垃圾,或者什么都没有,但它没有并指向5、已经删除 b的值。

真的会发生什么?为什么这段代码有效?

4

2 回答 2

3

看起来它有效,但实际上它没有。

*a 指向栈上的地址。

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

但是,由于堆栈不会根据您的代码发生太大变化,因此值 5 仍会写入特定地址,因此会打印值 5。如果你调用其他函数然后打印 **a 你可能会得到不同的值。

于 2013-08-08T17:36:17.627 回答
2

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

于 2013-08-08T17:36:30.553 回答