字符串由另一个字符串的第一个字符串构成 - 为什么它还打印完整的原始字符串?

Vol*_*ort 1 c++ string iostream char

学习C++.我只想抓取字符串中的第一个字符,然后根据这样的字符创建一个新字符串,然后将其打印出来:

#include <iostream>
using namespace std;

int main(int argc, const char * argv[]) {
    string name = "Jerry";
    char firstCharacter = name.at(0);
    string stringOfFirstCharacter = string(&firstCharacter);
    cout << stringOfFirstCharacter;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

J
Jerry
Run Code Online (Sandbox Code Playgroud)

我真的不知道为什么它也印刷Jerry.这是为什么?

Dav*_*eas 8

您的代码具有未定义的行为.获取指针的构造函数的签名char要求它是一个指向空终止字符串的指针,因为它是单个字符,所以它不在你的情况下.

我的猜测是你所拥有的实现使用了小对象优化,并且"Jerry"足够小以至于它存储在std::string对象中而不是动态分配.在堆叠中的两个对象的布局恰好是第一firstCharacter,然后name.当你调用std::string(&firstCharacter)它读取,直到它命中第一个空字符(在std::string缓冲区内)并停在那里.