指针和文字常量
Pointers and literals constant
我有一个代码不应该工作,但它可以工作。你能告诉我为什么吗?
#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,您可能会得到不同的值。
在您的情况下,内存不会立即被覆盖。这是未定义的行为,它可能不会一直表现得一样。每个编译器可能会对其进行不同的处理,您可能会在不同的平台上看到不同的结果,甚至在发布与调试模式下也会看到不同的效果。
相关文章:
- 常量函数,当其参数是对文字类型的引用时
- 为什么文字不是常量(字符串除外)?
- 模板接受常量,但不接受文字
- C++ 常量指向文字的指针有效吗?
- 为什么对字符串参数的常量引用可以采用字符串文字?
- 字符串文字可以传递给接受常量字符*的函数吗?
- 是否将常量字符*设置为等于字符[]文字安全
- 文字符号和字符串变量之间的串联然后返回常量字符*
- 字符串文字绑定到一个非常量字符指针
- 从文字字符串生成编译时常量整数
- 不以nul结尾的常量字符串文字
- Visual Studio 2015字符串文字并不总是常量
- 其中C++内存中的文字常量存储
- 为什么不允许我将函数返回 const char* 的结果分配给 char*,bt 可以将字符串文字(常量)分配给 cha
- 以前定义的常量,作为宏参数给出,被认为是字符串文字
- 我是否应该为代码中的重复文字定义常量
- 为什么字符常量/文字不能为空?
- C++ 连接__func__和常量字符文字
- 指针和文字常量
- C/C++NaN常量(文字)