【问题标题】:Qt array of char pointersQt char 指针数组
【发布时间】:2018-09-18 22:00:22
【问题描述】:

我正在尝试将十六进制的值存储在字符指针数组中并将其传递给另一个函数,该函数计算十六进制值的 CRC。但问题是有时输出相同,或者有时 pttr[0] 的值为 0。

这是我现在得到的结果,0xFF 0xFF。我在这里做错了什么吗?谢谢。

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    char *pttr[2];
    pttr[0] =  QString("0x%1").arg(155, 2, 16, QLatin1Char('0')).toLatin1().data();
    pttr[1] =  QString("0x%1").arg(255, 2, 16, QLatin1Char('0')).toLatin1().data();

    printf("%s \n",pttr[0]);
    printf("%s \n",pttr[1]);

    return a.exec();
}

【问题讨论】:

    标签: c++ arrays qt pointers


    【解决方案1】:

    使用问题

    char *pttr[2];
    pttr[0] =  QString("0x%1").arg(155, 2, 16, QLatin1Char('0')).toLatin1().data();
    pttr[1] =  QString("0x%1").arg(255, 2, 16, QLatin1Char('0')).toLatin1().data();
    

    就是临时对象有两层。

    QString("0x%1").arg(155, 2, 16, QLatin1Char('0')) 创建一个临时的 QString 对象。
    QString("0x%1").arg(155, 2, 16, QLatin1Char('0')).toLatin1() 创建一个临时的 QByteArray 对象。

    在这些行执行完毕后,pttr 最终持有两个悬空指针。取消引用这些指针会导致未定义的行为。

    请注意,即使

    QString str("Some value");
    char const* cp = str.toLatin1().constData();
    

    不正确。 cp 在这种情况下也是一个悬空指针。

    当您需要获得对底层char 对象的只读访问权限时,您应该保留QString 对象并使用toLatin1().constData()

    QString str_array[2];
    str_array[0] =  QString("0x%1").arg(155, 2, 16, QLatin1Char('0'));
    str_array[1] =  QString("0x%1").arg(255, 2, 16, QLatin1Char('0'));
    
    printf("%s \n", str_array[0].toLatin1().constData());
    printf("%s \n", str_array[1].toLatin1().constData());
    

    【讨论】:

    • ..或者直接对QByteArray进行操作,避免了不必要的toLatin1()转换。
    【解决方案2】:

    data 返回的数组仍归QString 所有。如果你有一个像这样的临时QString,它将在语句结束时被销毁,使返回的指针指向未初始化的内存。

    一般来说,在使用 Qt 时,您应该将字符串保存在 QStrings 中。如果您需要从一个char* 中取出一个,请在需要时进行,而不是初始化char* 变量。

    【讨论】:

      猜你喜欢
      • 2021-01-26
      • 2018-04-05
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      相关资源
      最近更新 更多