Массив Qt указателей на символы - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь сохранить шестнадцатеричное значение в массиве указателей символов и передать его другой функции, которая вычисляет 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();
}

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Проблема с использованием

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());
0 голосов
/ 19 сентября 2018

Массив, возвращаемый data, все еще принадлежит QString.Если у вас есть временный QString такой, он будет уничтожен в конце оператора, и возвращенный указатель будет указывать на неинициализированную память.

В общем случае вы должны хранить свои строки в QString с.при использовании Qt.Если вам нужно получить char* из одного, делайте это в момент необходимости, а не для инициализации переменной char*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...