我有两个问题。两者都可以通过这个简单的代码(使用 g++ -Wall -O2 -std=c++14 编译)来说明:
#include <string>
using namespace std;
const char *printi(const unsigned long &i) {
return to_string(i)).c_str();
}
int main() {
unsigned long i1 = 1; unsigned long i2 = 2;
fprintf(stderr, "%s%s\n", printi(i1), printi(i2));
}
问题编号1 - 它打印“11”,而它应该打印“12”。
问题编号2 - 有时它根本不打印数字,而是打印一些奇怪的字符。
最佳答案
请注意 std::to_string()
返回一个 std::string
。此 std::string
仅存在于 printi()
函数范围内,这意味着当您退出该函数时(当您返回
时),此 std::string
的析构函数被调用,您返回的地址(c_str()
返回的值)不再指向有效内存。您的代码具有未定义的行为,因为您不知道它现在指向哪些数据。
为了解决这个问题,您可以让 printi()
返回一个 std::string
,它会在 返回时被深度复制到调用者中
,然后调用者可以根据需要使用c_str()
:
#include <string>
using namespace std;
string printi(const unsigned long &i) {
return to_string(i);
}
int main() {
unsigned long i1 = 1; unsigned long i2 = 2;
fprintf(stderr, "%s%s\n", printi(i1).c_str(), printi(i2).c_str());
}
关于c++ - fprintf 对函数返回的字符有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40141312/