字符和int连接何时导致seg错误?

its*_*elp 1 c++

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int number = 900;
    cout << std::string("Hello, World!" + number) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道正确的解决方案是使用std::to_string(number).但问题是,为什么我没有得到分段错误?我甚至通过valgrind来运行它.字符串长度约为13,我移动指针900.

Bat*_*eba 5

表达式 "Hello, World!" + number是一个const char[]文字加入到int.前者衰减到一个const char*指针,你number通过指针算法添加它.

由于该最终指针不在原始字符串常量中,因此您将无效const char*指针传递给std::string构造函数,并且程序的行为未定义.此时可能发生任何事情,包括运行时崩溃.积极优化的编译器可能会完全省略未定义的表达式; 越来越普遍了.

繁荣!

如果你想连接 900到字符串,那么你可以写

std::cout << std::string("Hello, World!" + std::to_string(number)) << std::endl;
Run Code Online (Sandbox Code Playgroud)

  • 你们所有人现在应该更清楚地知道:P但是说真的.我认为关于UB固有缺乏保证的更多话语将使其成为正确的答案. (3认同)