将 QByteArray 转换为 char* 的问题

Issue with conversion QByteArray to char*

我遇到了一个问题,在将 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的输出在情况1中是错误的,但在情况2中是正确的。我可以交换情况1和2,结果是一样的——在情况1中是错误的,但在情况 2 中是正确的。

内联转换似乎工作得很好。

如果使用 const char* 变量存储结果,从 QByteArrayconst char* 的转换是否有任何问题?

toUtf8 returns 生命周期结束于表达式末尾的对象。
constData returns 指向此临时对象的指针。
因此,您使用的是悬挂指针并且行为未定义。

您需要延长转换后的字符串的生命周期:

QString string1("ABCDEFGHI");
QByteArray utfString = string1.toUtf8();
const char* stringData1 = utfString.constData();

此调用 string1.toUtf8().constData() 由两个后续调用组成:QString::toUtf8() 产生临时 QByteArrayQByteArray::constData() returns 指向临时的指针最终被销毁的对象。

我以前获取QString变量,将其转换为QByteArray,最后const char*的方式是这样的:

QString var1 = ui->lineEdit->text().toUtf8();
QByteArray ba = var1.toLocal8Bit();
const char *var1final = ba.data(); 

QString的值由Ui在lineEdit中收集。