我对以下C++代码感到困惑:
#include <iostream>
using namespace std;
void test(const string& str)
{
static const char * const c = str.c_str();
cout << c << endl;
}
int main(int argc, char* argv[])
{
test("Hello");
test("Nooo");
return 0;
}
由于变量
c
声明为static
和const
,难道不应该仅将其初始化一次并保持其初始值直到过程完成吗?根据这种推理,我期望得到以下输出:Hello
Hello
但是我得到了:
Hello
Nooo
您能否阐明为什么变量
c
的值是两个const
变量却在两个函数调用之间进行了修改? 最佳答案
您的程序具有未定义行为。
当您将"hello"
传递给test
时,将创建一个临时的std::string
对象,并从该字符串中构造c
(这只是指向该字符串对象的数据的指针)。
当函数调用结束时,临时std::string
对象被破坏,并且c
变成了悬空指针。再次使用它是未定义的行为。
在您的情况下,第二个临时std::string
对象的数据具有与第一个完全相同的内存地址,因此c
指向该数据。对此不做任何保证。
关于c++ - 静态const变量的初始化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38572235/