• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Определение размера структуры с помощью Sizeof

  • Автор темы Guest
  • Дата начала
G

Guest

Подскажите кто знает!

Пишу на C++ Builder 2007.

Имеется такая структура

struct log_adat_type
{
char type; //Тип устройства //1 Байт
char XXXXXXX[3]; //3 Байта
double datum; //Дата приема данных //8 Байт
double ido; //Время приема данных //8 Байт
unsigned short busz; //Код мобильного интерфейса //2 Байта
unsigned short kodado; //Код остановки //2 Байта
unsigned short interface1; //2 Байта
unsigned short interface2; //2 Байта
unsigned short kezelo_ID_1; //Kezelõ_Id_1 As Integer //2 Байта
unsigned short kezelo_ID_2; //Kezelõ_Id_2 As Integer //2 Байта
unsigned short stage_number_1; //Munkaállás_Sorszám_1 As Integer //2 Байта
unsigned short stage_number_2; //Munkaállás_Sorszám_2 As Integer //2 Байта*/
double joint_time_period; //Kapcsolódó_Idõpont As Double //8 Байта
unsigned short adat_1; //Adat_1; //2 Байта
unsigned short adat_2; //Adat_2 As Integer //2 Байта
unsigned short adat_3; //2 Байта
char state_1; //Státusz //1 Байт
char state_2; //Státusz_2 As String * 1 //1 Байт
char state_3; //Státusz_3 As String * 1 //1 Байт
char state_4; //Státusz_4 As String * 1 //1 Байта
char XXXXXX[2]; //As String * 2 //2 Байта
} dataRead;

Структурка была взята из бэйсика там она размером 56 байт
Поменял все типы как надо посчитал в ручную занимает тоже 56 байт!

Но когда определяю размер структуры с помощью sizeof то получается что она размером 64 байта!
Как такое получается???

Если все зарэмить кроме первых двух чаров выдает размер 4
Если заремить все кроме двух первых Даблов выдает 16
А если все зарэмить кроме первых четырех строчек где два Чара и два Дабла выдает 24 как так получается?

Получается если данные в структуре одного типа то все правильно размер считается а если разных то не правильно!
К примеру если оставить один чар и один дабл то почему то размер структуры будет 16 байт!
Что я не так делаю то???

Вывод на экран через Edit1->Text = sizeof (dataRead);
Больше не какого кода нет!
 
P

Pasha

Для: Щенок
 
E

European

Для: Щенок
В настройках компилятора можно изменит дефолтовое выравнивание в 1б, тогда размер будет 56, если тебе это так нужно
 
B

boden

Для: Щенок
В настройках компилятора можно изменит дефолтовое выравнивание в 1б, тогда размер будет 56, если тебе это так нужно
Зачем? Это скажется на выравнивании в других местах, что может оказаться фатальным. По ссылке, которую дал Pasha есть хороший пример
Код:
#pragma pack(push) /* push current alignment to stack */
#pragma pack(1)	 /* set alignment to 1 byte boundary */

struct MyPackedData
{
char Data1;
long Data2;
char Data3;
};

#pragma pack(pop)  /* restore original alignment from stack */
 
E

European

<!--QuoteBegin-boden+29:10:2007, 10:33 -->
<span class="vbquote">(boden @ 29:10:2007, 10:33 )</span><!--QuoteEBegin-->Это скажется на выравнивании в других местах, что может оказаться фатальным
[snapback]83383" rel="nofollow" target="_blank[/snapback]​
[/quote]
При корректном коде, ничего фатального
 
P

Pasha

Для: European
Осталось только обеспечить корректность кода и одинаковые настройки компилятора у всех, кто попытается работать c исходниками или API мегасофтины.
 
E

European

Мля, давайте на меня еще кроссплатформенность натравим! Если человек первый раз видит выравнивание, о чем может быть речь?
 
P

Pasha

Для: European
Речь о том, что не надо вести человека на грабли, надо по возможности обводить :)
 
Мы в соцсетях:

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