【发布时间】:2015-10-27 00:53:29
【问题描述】:
我是一名 C# 开发人员,当我在 C++ 中运行以下代码时,我觉得很奇怪:
std::string original = "Hello";
std::string st = original + "World";
const char *c = st.c_str();
const char *c2 = (original + "World").c_str();
std::cout << "c = '" << c << "'" << std::endl;
std::cout << "c2 = '" << c2 << "'" << std::endl;
我得到以下输出:
c = 'HelloWorld'
c2 = ''
在 C# 中,类似的构造将导致 c 和 c2 具有相同的值(“Hello World”)。我的猜测是(original + "World") 的结果范围在右侧) 结束,所以c_str() 在无效输入上被调用。那是对的吗?除了创建变量来保存临时结果之外,有没有更好的方法来实现这一点?
谢谢!
【问题讨论】:
-
问题是你有一个指向缓冲区的指针,该缓冲区在对象被销毁后失效。试试这个
std::cout << "c2 = '" << (original + "World").c_str() << "'" << std::endl; -
@VictorPolevoy:这就是未定义行为的本质。
-
@VictorPolevoy 即使您看到了并不意味着它有效的所需输出
-
我看不出根据 C# 的功能得出 C++ 应该做什么的结论的目的。你知道他们是不同的语言,对吧?
-
单独学习 C++ 的工作原理要比将其作为与其他语言的差异函数来学习更有建设性。