我有一个代码不应该工作,但它的工作原理。你能告诉我为什么吗?
#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
。
真正发生了什么?为什么这段代码有效?
答案 0 :(得分:3)
它似乎有效,但实际上并没有。
*指向堆栈上的地址。
当你打印** a时,acutaly打印的是堆栈上某个地址的内容。 (调用函数f时包含5的地址。)
但是,由于堆栈根据您的代码没有太大变化,因此值5仍然写在特定地址上,因此打印值为5。 如果你打电话给其他功能然后打印**你可能会得到不同的价值。
答案 1 :(得分:2)
在您的情况下,内存不会立即被覆盖。这是未定义的行为,并且它可能不会始终表现相同。每个编译器可能会以不同的方式对待它,您可能会在不同的平台上甚至在发布与调试模式中看到不同的结果。