两个不同的字符指针最终具有相同的值 [duplicate]

Two different char pointers end up with the same value [duplicate]

提问人:MrMiserMeister 提问时间:9/13/2023 更新时间:9/13/2023 访问量:46

问:

我假设这是未定义的行为,但我不确定为什么?

当我用 g++ 4.4.7 编译上述代码并执行它时:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string A = "-A";
    string B = "_B";
    string common = "Common";
    const char* commonA = (common + A).c_str();
    const char* commonB = (common + B).c_str();
    
    cout << commonA << endl;
    cout << commonB << endl;
    
    return 0;
}

结果显示 commonA 和 commonB 的计算结果均为“Common_B”。

我注意到,当我将相同的代码放入在线 c++ ide 中时,我得到了预期的结果,其中 commonA 是“Common-A”,commonB 是“Common_B”。因此,为什么我认为我正在做的是未定义的行为。

通过将字符串连接和 c_str() 调用分为两步,我能够获得原始代码片段,为我提供 g++ 4.4.7 中的预期行为。即:

    string commonA_str = common + A;
    string commonB_str = common + B;

    const char* commonA = commonA_str.c_str();
    const char* commonB = commonB_str.c_str();

这到底是怎么回事,有什么安全的方法呢?

谢谢!

C++ 字符串 指针 char-pointer

评论

4赞 Drew Dormann 9/13/2023
是的,未定义的行为。 是临时的,并生成指向该临时数据的指针。到达时,指针立即悬空。(common + A)(common + A).c_str();
0赞 PaulMcKenzie 9/13/2023
而不是 ,将其视为返回 .这将是暂时的,因此所指的也是暂时的,当达到时将不再有效。(common + A)std::stringstd::stringc_str();

答: 暂无答案