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);
我需要将所有原始数据类型转换为 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);