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