指针和文字常量

Pointers and literals constant

本文关键字:常量 文字 指针      更新时间:2023-10-16

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

#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

到底发生了什么?为什么这个代码有效?

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

*a指向堆栈上的地址。

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

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

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