C++ to_string 函数根据额外打印语句的存在为 float 和 int 转换提供不同的结果

C++ to_string function giving different results for float and int conversion depending on the prescence of an extra print statement

我需要将所有原始数据类型转换为 char* 形式,我试图通过使用函数 to_string 来实现,但是当 char * 数组传递给另一个函数时,两种数字数据类型(int 和 float)输出相同的值。

这是相关代码:

#include <iostream>
#include <string>
#include "pythonInvoker.h"
using namespace std;
int main(){
    char * types = "sif";
    const char * strin = "Hello World!";
    int num = 2851791;
    float point = 75.123123;

    const char* argv[] = {"", "multiply", "multiply", strin, (std::to_string(num)).c_str(), (std::to_string(point)).c_str()};
    int argc = sizeof(argv) / sizeof(char *);





PyObject* pyObject = invokeFunc(argc, types, argv);
return 0;
}

发送给 invokeFunc 的数组是:

 multiply multiply Hello World! 75.123123 75.123123 

但是当我在调用 invokeFunc 之前添加这一行时,数组发生了变化: 该行:

cout<<(std::to_string(num)).c_str()<<endl;

输出:

 multiply multiply Hello World! 2851791 2851791 

发生了什么事?

表达式std::to_string(num))returns一个临时对象,std::to_string(num)).c_str()是这个临时对象内部的一个指针。临时对象 "lives" 只要在其中使用它的语句。因此,在 const char* argv[] = {"", "multiply", strin, std::to_string(num).c_str(),... 之后,它超出了范围,在您将它传递给后面语句中的函数之前,"dies"。访问存储在 argv 中的指针的结果是未定义的行为,您正在观察其中之一。

如果将 std::to_string(num) 的结果存储在局部变量中,该变量的生命周期超过后续函数调用,它应该可以工作:

std::string numStr = std::to_string(num);
const char* argv[] = {"", "multiply", "multiply", strin, numStr.c_str(), ...}
....
PyObject* pyObject = invokeFunc(argc, types, argv);