Fprintf对函数返回的字符有问题

fprintf has problems with characters returned by a function

本文关键字:字符 有问题 返回 函数 Fprintf      更新时间:2023-10-16

我有两个问题。这两者都可以用下面的简单代码来说明(用c++ -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%sn", printi(i1), printi(i2));
}

没有问题。1 -打印"11",而应该打印"12"。

没有问题。2 -有时它根本不打印数字,而是打印一些奇怪的字符。

注意,std::to_string()返回一个std::string。这个std::string只存在于printi()函数作用域中,这意味着当你退出这个函数时(当你执行return时),这个std::string的析构函数被调用,你返回的地址(由c_str()返回的值)不再指向有效的内存。你的代码有未定义的行为,因为你不知道它现在指向哪个数据。

为了解决这个问题,您可以让printi()返回一个std::string,它将被深度复制到return的调用者中,然后调用者可以根据需要使用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%sn", printi(i1).c_str(), printi(i2).c_str());
}