字符指针的 Qt 数组



我正在尝试将十六进制的值存储在字符指针数组中,并将其传递给另一个函数,该函数计算十六进制值的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();
}

使用

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也是一个悬空的指针。

应保留QString对象,并在需要获取对基础char对象的只读访问权限时使用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());

data返回的数组仍归QString所有。如果你有这样的临时QString,它将在语句末尾被销毁,留下返回的指针指向未初始化的内存。

一般来说,在使用Qt时,你应该把你的字符串保持在QString秒。如果您需要从中获取char*,请在需要时执行此操作,而不是初始化char*变量。

最新更新