【问题标题】:Different results for QString to const char*QString 到 const char* 的不同结果
【发布时间】:2017-12-13 08:05:35
【问题描述】:

我有一个代码 sn-p 来测试代码错误。

    #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 值,那问题呢? 另外,这两个操作系统之间存在一些差异,可能是什么原因?

【问题讨论】:

    标签: c++ qt qstring const-char


    【解决方案1】:

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

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

    正确版本:

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

    【讨论】:

      【解决方案2】:

      问题是toLatin1 函数返回一个QByteArray 对象,如果不保存这个对象,它将是临时的,一旦分配完成就会被破坏。

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

      【讨论】:

      • 哦,我明白了。我可以使用“strcpy”来复制 QByteArray 的缓冲区值吗?我已经测试过了,它可以工作。
      • @user3857893 是的,你可以。但是你需要分配内存,并且不要忘记字符串终止符。我也想知道为什么你需要这个指针?如果您只是要将它传递给 C 函数,那么可以像您一样使用临时对象(只要您这样做,例如 name.toLatin1().data() 用于 argument 表达式)。
      • 你是对的,因为我有很多地方把这个值作为“const char *”的类型,所以我把这个值保存在一个const变量中。
      猜你喜欢
      • 2020-11-13
      • 2014-01-16
      • 2012-11-30
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多