c++ - 指针和文字常量

标签 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 上的指针, 然后当 main()执行 f()应该删除所有局部变量然后继续,所以 a应该指向垃圾桶,或者什么都没有,但它没有并指向 5,值 already deleted b .

究竟发生了什么?为什么这段代码有效?

最佳答案

看似有效,但实际上没有。

*a 指向栈上的地址。

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

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

关于c++ - 指针和文字常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18132354/

相关文章:

c++ - 保留一份 future 要做的工作 list

c++ - 跳过不兼容的 libpcap.so - 交叉编译

C++如何管理连续动态数组的迭代器

c - 如何在字符串中显示字符\t?

python - 以 10 为基数的 int() 的文字无效 : 'i' : jump program

c++ - 在 C++ 中使用 if(num & 2) 作为条件?

c++ - 从源代码编译与 deb 包编译

c - 警告 : control reaches end of non-void function [-Wreturn-type] even if with "return 0;" in main function

c - 指针:引用第一个元素是否有助于定位整个数组?

c++ - 作为参数传递时字符串文字的存储类型