C++ to_string函数根据额外打印语句的先见之明,为浮点数和整数转换提供不同的结果

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

本文关键字:整数 转换 浮点数 结果 的先见之明 函数 string to 语句 打印 C++      更新时间:2023-10-16

我需要将所有原始数据类型转换为 char* 形式,我正在尝试使用 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))返回一个临时对象,std::to_string(num)).c_str()是这个临时对象内的指针。临时对象"存在"的时间与使用它的语句一样长。因此,在const char* argv[] = {"", "multiply", strin, std::to_string(num).c_str(),...之后,它超出了范围并"死亡",然后再在后面的语句中将其传递给函数。然后,访问存储在 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);