gpt4 book ai didi

c++ - 为什么我的 char* 无故改变?

转载 作者:行者123 更新时间:2023-11-30 02:52:59 25 4
gpt4 key购买 nike

详细信息:

我正在使用这个 github 项目将 Json 转换为对象。

https://github.com/ereilin/qt-json

使用这个 json:

{
"bin": "/home/pablo/milaoserver/compile/Devices01.olk",
"temp":"/home/pablo/milaoserver/temporal/",
"port": "1234",
"name": "lekta",

}

用这两行我创建了两个字符指针:

 char* bin = configuration["bin"].toString().toLatin1().data();
char* temp = configuration["temp"].toString().toLatin1().data();

调试应用我有正确的字符串。

但是当我使用它们时,具体的“bin”字符变为

`hom 

有什么想法吗?

评论中的解决方案:

问题是数据的“持久性”。

我找到了解决方案:

std::string binAux(configuration["bin"].toString().toLatin1().data());
std::string tempAux(configuration["temp"].toString().toLatin1().data());

char* bin = new char[binAux.size()+1] ;
strcpy(bin, binAux.c_str());

char* temp = new char[tempAux.size()+1] ;
strcpy(temp, tempAux.c_str());

最佳答案

这里的错误是因为临时对象。

toString() 创建一个分号后不再可用的临时对象。

标准状态:

12.2 Temporary objects [class.temporary]

3/ [...] Temporary objects are destroyed as the last step in evaluating the full-expression (1.9) that (lexically) contains the point where they were created. This is true even if that evaluation ends in throwing an exception. The value computations and side effects of destroying a temporary object are associated only with the full-expression, not with any specific subexpression.

也就是说,当您想访问它时,您有未定义的行为

这应该可以解决您的问题:

QString str = configuration["bin"].toString().toLatin1();
QByteArray ba = str1.toLatin1();
char *bin = ba.data();

但是你想用 char* 做什么?你在 C++ 中,请改用 std::stringQstring :

#include <string>

std::string bin(configuration["bin"].toString().toLatin1().data());

关于c++ - 为什么我的 char* 无故改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18401345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com