C - деконструкция структуры в массив символов - PullRequest
0 голосов
/ 21 мая 2018

Почему код ниже выдает

09 17 13 FFFFFF88

Где я ожидаю увидеть

09 13 88

Код ниже

struct ztest
{
  uint8_t a;
  uint16_t b;
};

struct ztest zt;
char * dd = (char *) &zt;
zt.a = 9;
zt.b = 5000;
for (i = 0; i < sizeof(zt); i++) {
   printf("%02X ",dd[i]);
}

Это работает в системе openwrt ar71xx,Цель состоит в том, чтобы отправить массив символов по последовательной линии (в случае необходимости).

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Ваш код опирается на поведение, определяемое реализацией, поэтому невозможно предсказать, что вы увидите, не зная специфики системы, в которой он работает:

  • Размер struct ztest может включать заполнение
  • char может быть подписано или без знака
  • Байты uint16_t могут храниться в виде с прямым порядком байтов или с прямым порядком байтов

Похоже, что ваша система добавляет один байт заполнения к struct ztest, использует подписанные char s и сохраняет uint16_t с самым старшим байтом по младшему адресу.

значение 0x17 - это «мусор» из байта заполнения.Значение 0x88 получает знак расширения для печати в виде знака int, что приводит к 0xFFFFFF88 распечатке.

0 голосов
/ 21 мая 2018

Структура ztest имеет размер 4. Он имеет один беззнаковый символ, один байт заполнения и два байта для короткого.Поэтому, когда вы пытаетесь отобразить dd[1], у вас на самом деле неопределенное поведение.

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