Опять про Struct

  • Автор темы Автор темы debug
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
D

debug

Ниже я задавал подобный вопрос - незнание это плохо - но не нашёл ответов на следующий вопрос:
Имеется код:
Код:
struct SIGNAL_STATUS {
char status_t;
unsigned short gNumber;
unsigned char sNumber;
unsigned short info;
unsigned short panel;
};

char temp[16];
memset(temp, 0, 16);
temp[0]=0x14;
temp[1]=0;
temp[2]=0x01;
temp[3]=0x01;
temp[4]=0;
temp[5]=0;
temp[6]=0;
temp[7]=0x01;
SIGNAL_STATUS *sg=(SIGNAL_STATUS*)temp;
sg->status_t;
sg->gNumber;
sg->sNumber;
sg->info;
sg->panel;

Резхультаты к сожалению не ожидаемые мной.
Что я ожидал:
sg->status_t=0x14
sg->gNumber=0x0001
sg->cNumber=0x01
sg->info=0x0000
sg->panel=0x0001

что получаеться на самом деле:
sg->status_t=0x14
sg->gNumber=257
sg->cNumber=0
sg->info=256
sg->panel=..

Могу конечно ошибиться - но факт тот - что результат сильно отличается от ожидаемого.
Что здесь может быть - выравнивание или сетевой порядок байт (похоже чем то), хотя думаю последнее тут не причём.
 
Немного разобрался с выравниванием - как мне ответили в предыдущем вопросе - объявил так
Код:
#pragma pack(push,1)
struct SIGNAL_STATUS {
char status_t;
unsigned short gNumber;
unsigned char sNumber;
unsigned short info;
unsigned short panel;
};
#pragma pack(pop)

Результат после этого стал таким (в предыдущем примере)
sg->status_t=0x14
sg->gNumber=256
sg->cNumber=1
sg->info=0
sg->panel=256

Вижу - что переменные структуры типа short видимо хранятся в памяти в обратном порядке байт.
Почему - если я заполняю памать прямо, так видимо храняться переменные целых типов в памяти?
И ещё вопрос - как избежать этого выравнивания по другому - я с такими проблемами ещё не встречался :) - очч неприятная вещь.
 
Избежать - опцией компилятора выравнивать всегда по 1 байту. А по порядку байт - почитай где нибудь про органицацию памяти в x86.

 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!