Проблема с использованием
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
объекты и использовать toLatin1().constData()
, когда вам нужно получить доступ только для чтения к базовым char
объектам.
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());