我对以下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声明为staticconst,难道不应该仅将其初始化一次并保持其初始值直到过程完成吗?根据这种推理,我期望得到以下输出:
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/

10-08 21:02