gpt4 book ai didi

c++ - std::string 复制构造函数是否自行在末尾添加空字符?

转载 作者:太空狗 更新时间:2023-10-29 19:40:28 27 4
gpt4 key购买 nike

首先我在做,

#include <iostream>
#include <string>

void foo (std::string s) {
std::cout << s << std::endl;
}

int main () {
char st[] = "0";
st[1] = '[';
std::string s (st);
std::cout << s << std::endl;
return 0;
}

当我使用流插入运算符发送到流对象 cout 时,它显示垃圾(我猜这是一种正常行为)。

然后我通过按值传递给函数 foo 来进行检查。我现在正在做这样的事情。

    foo (s);

// after calling foo () value printed by the
// std::cout is changed. it takes care of NULL character ('\0')
std::cout << s << std::endl;

0[ 之后不再显示垃圾信息。为什么?

我的问题是,我在foo()中按值传递了字符串。在运行 foo () 的主体之前运行一个复制构造函数。但仍然没有意义。这个 copyctor 如何按值更改从 main () 传递的参数?

提前致谢。

最佳答案

char st[] = "0";

小测验:st 有多大?

答案:两个字符,一个用于“0”,一个用于空终止符。

然后你去覆盖空终止符:

st[1] = '[';

...并尝试以此为基础构造一个字符串:

std::string s (st);

接受 const char*string 构造函数在这里被调用,它的工作方式是寻找 null 终止符。因为你把它吹走了,它会运行到 st 的末尾。运行超过 st 的末尾会引发未定义的行为,这也是您看到垃圾的原因。

重要的是要注意未定义的行为意味着任何都可能发生。这里的“任何事”包括“正是我想要发生的事”。您不一定会得到垃圾输出,或者您的程序会崩溃。试图找出为什么 UB 以这种或那种方式表现出来是一种不合理的努力。

关于c++ - std::string 复制构造函数是否自行在末尾添加空字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23411983/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com