c++ - fprintf 对函数返回的字符有问题

标签 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 - 有时它根本不打印数字,而是打印一些奇怪的字符。

最佳答案

请注意 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/

相关文章:

c - 如何将 uint32 转换为 unsigned char 数组

c++ - 将可变字符串转换为char数组c++

c - printf(s) 和 printf ("%s", s) 之间的根本区别是什么?

c++ - sprintf_s 导致崩溃

c - printf 语句是如何解释的?

c++ - 从大小映射到相应的 uintN_t 类型

java - 当我包含 header 时,Gradle 将不会构建可执行文件

检查字符串是否只有 C 中的数字?

c++ - std::map<>::insert 使用不可复制对象和统一初始化

c++ - 使 fatal error : boost/fusion/iterator/equal_to. hpp 没有这样的文件或目录