将 QByteArray 转换为 char* 的问题
Posted
技术标签:
【中文标题】将 QByteArray 转换为 char* 的问题【英文标题】:Issue with conversion QByteArray to char* 【发布时间】:2020-12-11 11:52:45 【问题描述】:我遇到了一个问题,在将QByteArray
转换为const char*
时我无法解释不是内联。这是一个例子:
QString string1("ABCDEFGHI");
const char* stringData1 = string1.toUtf8().constData();
qDebug() << "String:" << string1 << "\nbytearray:" << string1.toUtf8()
<< "\ndata immediate:" << string1.toUtf8().constData() << "\ndata stored:" << stringData1;
QString string2("ABCDEFGHJ");
const char* stringData2 = string2.toUtf8().constData();
qDebug() << "String:" << string2 << "\nbytearray:" << string2.toUtf8()
<< "\ndata immediate:" << string2.toUtf8().constData() << "\ndata stored:" << stringData2;
我得到以下输出:
String: "ABCDEFGHI"
bytearray: "ABCDEFGHI"
data immediate: ABCDEFGHI
data stored:
String: "ABCDEFGHJ"
bytearray: "ABCDEFGHJ"
data immediate: ABCDEFGHJ
data stored: ABCDEFGHJ
data stored
的输出不能保证在 case 1 中是错误的,但在 case 2 中是正确的。我可以交换 case 1 和 case 2,结果将是相同的 - 在 case 1 中错误,但在 case 中正确2.
内联转换似乎工作得很好。
如果使用const char*
变量存储结果,您是否发现从QByteArray
到const char*
的转换有任何问题?
【问题讨论】:
您在QString::toUtf8
返回的临时 QByteArray
上调用QByteArray::constData
。所以stringData1
和stringData2
是悬空指针:未定义的行为。
【参考方案1】:
toUtf8
返回一个对象,其生命周期在表达式末尾结束。constData
返回指向此临时对象的指针。
因此,您使用的是悬空指针并且行为未定义。
需要延长转换后字符串的生命周期:
QString string1("ABCDEFGHI");
QByteArray utfString = string1.toUtf8();
const char* stringData1 = utfString.constData();
【讨论】:
【参考方案2】:此调用 string1.toUtf8().constData()
包含两个相应的调用:QString::toUtf8()
产生一个临时的 QByteArray
和 QByteArray::constData()
,它返回一个指向临时对象的指针,该对象最终被销毁。
【讨论】:
【参考方案3】:我以前获取 QString 变量的方式,将其转换为 QByteArray,最后 const char* 是这样的:
QString var1 = ui->lineEdit->text().toUtf8();
QByteArray ba = var1.toLocal8Bit();
const char *var1final = ba.data();
QString 的值由 Ui 收集,在 lineEdit 中。
【讨论】:
以上是关于将 QByteArray 转换为 char* 的问题的主要内容,如果未能解决你的问题,请参考以下文章