繁体   English   中英

C++ to_string 函数根据额外打印语句的出现给出不同的浮点和整数转换结果

[英]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))返回一个临时对象,而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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM