QString到const char *的结果不同

时间:2017-12-13 08:05:36

标签: c++ qt qstring const-char

我有一个代码片段来测试代码错误。

    #include <QCoreApplication>
    #include <QDebug>

    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        QString name = QString("Lucy");
        QString interest = QString("Swimming");

        const char* strInterest = interest.toLatin1().data();
        const char* strName = name.toLatin1().data();

        qDebug()<<"QName: "<<name<<" QInterest: "<<interest;
        qDebug()<<"Name: "<<strName<<" Interest: "<<strInterest;

        return a.exec();
    }

macOS 的结果: QName: "Lucy" QInterest: "Swimming" Name: Lucy Interest:

ubuntu 的结果: root@:test$ ./testCharP QName: "Lucy" QInterest: "Swimming" Name: Interest:
如您所见,转换后的缓冲区不会保存为const值,问题又如何呢? 另外,这两个操作系统之间存在一些差异,原因可能是什么?。

2 个答案:

答案 0 :(得分:4)

您所观察到的是未定义的行为。

toLatin1()的调用会创建一个临时QByteArray,在该行之后会立即销毁,因为您不存储它。由data()获得的指针悬空,可能会或可能不会打印出有用的东西。

正确版本:

const QByteArray& latinName = name.toLatin1();
const char* strName = latinName.data();

答案 1 :(得分:1)

问题是toLatin1函数返回一个QByteArray对象,并且通过不保存此对象,它将是临时的,并且在完成赋值后将被销毁。

这意味着您的指针指向一些不再存在的数据,并且取消引用它将导致未定义的行为