fprintf函数返回的字符有问题

时间:2016-10-19 20:51:38

标签: c++ char printf

我有两个问题。这两个都可以用这个简单的代码来说明(用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 - 有时它根本不打印数字,而是一些奇怪的字符。

1 个答案:

答案 0 :(得分:4)

请注意,std::to_string()会返回std::string。此std::string仅存在于printi()函数范围内,这意味着当您退出函数时(当您return时),将调用此std::string的析构函数,并且您返回的地址(c_str()返回的值)不再指向有效内存。您的代码具有未定义的行为,因为您不知道它现在指向哪些数据。

为了解决这个问题,您可以让printi()返回std::string,这将在return后深深复制到调用者,然后调用者可以使用{{1}根据需要:

c_str()