为什么分配不相关的字符串会导致另一个字符串被修改?

Tom*_*Tom -2 c++

下面的例子中,我将fn作为指向常量c-string的const指针.当我声明并将不相关的其他const指针分配给不同的常量c-string时,原始fn会被修改.我一直在试图找出原因,但看不出可能导致这种情况的原因是什么?

输出:

原始fn:sampleStrWithExtension

修改后的fn:randomStr2ModifiedFn

int main() {
        std::string baseString = "sampleStr";
        std::string randomBaseString = "randomStr2";
        const char* const fn = (baseString + "WithExtension").c_str();
        std::cout << "Original fn: " << fn << std::endl;
        const char* const variableNotFn = (randomBaseString + "ModifiedFn").c_str();
        std::cout << "Modified fn: " << fn << std::endl;
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

Sam*_*hik 8

const char* const fn = (baseString + "WithExtension").c_str();
Run Code Online (Sandbox Code Playgroud)

这导致未定义的行为.

baseString + "WithExtension"
Run Code Online (Sandbox Code Playgroud)

这会创建一个临时std::string对象.a上的+运算符std::string返回一个new std::string,并且在该表达式的上下文中,返回的std::string变为临时对象.c_str()返回指向此临时对象的内部缓冲区的指针.

返回的指针c_str()仅在std::string修改之前有效,否则会被销毁.在上面的表达式的末尾,临时对象被销毁.

稍后使用此指针会导致未定义的行为.

  • 严格来说,这不是一个未定义的行为.它只是指向不再存在的字符串的指针.取消引用时会发生未定义的行为 (2认同)