Qt char 指针数组

Posted

技术标签:

【中文标题】Qt char 指针数组【英文标题】:Qt array of char pointers 【发布时间】: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();

【问题讨论】:

【参考方案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* 变量。

【讨论】:

以上是关于Qt char 指针数组的主要内容,如果未能解决你的问题,请参考以下文章

大虾我还想请问您一下qstring 如何转化为char数组而不是char指针(char*)

数组名相当于一个指针,哪数组指针char *p[],不就变成一个二级指针?

C语言中char数组与char指针问题

双指针将 char 数组值分配给 char 数组,结构使用 char 指针

指针数组数组指针函数指针指针函数总结

指向 char 指针数组的指针与指向 char 指针的指针(或 char** argv 与 char* (*argv)[])