【发布时间】:2017-12-02 05:59:58
【问题描述】:
当我运行以下代码时
#include <iostream>
int main(int argc, char *argv []) {
std::string simpleString("this is just a simple string");
std::cout << "simpleString = " << simpleString << std::endl << std::endl;
std::string one = (simpleString + ", one");
const char * oneCharStar = one.c_str();
std::cout << "simpleString + one: '" << oneCharStar << "'" << std::endl;
const char * twoCharStar = (simpleString + ", two").c_str();
std::cout << "simpleString + two: '" << twoCharStar << "'" << std::endl;
return 0;
}
在我的 Fedora Core 23 机器上, uname -a 报告:
"Linux glorp 4.5.7-202.fc23.x86_64 #1 SMP 2016 年 6 月 28 日星期二 18:22:51 UTC x86_64 x86_64 x86_64 GNU/Linux"
和 g++ --version 说
“g++ (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)”
第一个输出显示“这只是一个简单的字符串,一个”,而第二个输出显示的是空字符串。
我猜这里正在进行某种优化,但是,在我以前的 Ubuntu 机器(16.mumble,安息吧)上,这段代码运行得如我所料。我刚刚发现,当我在新机器上重新编译我的应用程序(使用相同的 make 文件等)时,此代码如上所示失败。
此外,它在以下平台上也可以正常工作:
$ uname -a Linux t4240rdb
3.12.37-rt51+g43cecda #2 SMP Fri Mar 4 18:18:03 EST 2016 ppc64 GNU/Linux
$ g++ --版本
g++ (GCC) 4.9.2
版权 (C) 2014 Free Software Foundation, Inc.
这里发生了什么?谢谢!
【问题讨论】:
-
你有未定义的行为。
-
我在提出问题之前尝试搜索答案。
-
@nzc 是的。你的问题问得很好。但是,当有人更熟悉确切的问题时,他们可能会提出更好的搜索并找到您的答案。这并不意味着你的问题不好。 StackOverflow 上的重复就可以了。
-
感谢您的解释。
-
“那么为什么像 (
).c_str() 这样的表达式有用呢?”可能 std::string::c_str() 最重要的用途是调用 Linux 或 POSIX API 或大型应用程序的前身函数,这些函数需要 c 样式的空终止字符串作为输入。
标签: c++