Возможный дубликат:
Почему sizeof для структуры не равен сумме sizeof каждого члена?
sizeof (struct) возвращает неожиданное значение
Я написал программу, чтобы найти размер следующей структуры abc.
а. Встроенный оператор sizeof () упоминает, что размер этой структуры равен 40, тогда как на самом деле это 32? Также я попытался вычесть адреса, чтобы определить это, и это также привело к 40.
б. Когда я комментирую «char g [3];» внутри структуры abc, размер abc = 32.
Это также не имеет никакого смысла для меня. Разве это не должно быть 28?
с. Зачем мне нужно приведение к «unsigned int»? Если я не выполняю приведение, я получаю следующее сообщение об ошибке компиляции. не &[0] на самом деле адрес (который должен быть int)?
size_of_struct \ size_of_struct.cpp (24): ошибка C2440: ‘=’: невозможно преобразовать из ‘abc *’ в ‘unsigned int’
Информация:
Я использую win 7, 64-битную систему. MS Visual Studio Компилятор.
#include <iostream>
struct char_three{
char a[3];
};
struct int_three{
int a[3];
};
struct abc
{
int a; // 4 bytes
double b; // 8
void *ptr; // 4
char g[3]; // 4 due to padding ?
int c[3]; // 12
}; // Total size of struct - 31 / 32.
int main ()
{
abc a[2];
unsigned int add0, add1;
add0 = (unsigned int) &a[0];
add1 = (unsigned int) &a[1];
printf("add1 of a is :%x add0 is :%x\n", add1, add0);
printf("size of struct abc : %d\n", add1-add0);
printf("size of int: %d\n", sizeof(int));
printf("size of double: %d\n", sizeof(double));
printf("size of void ptr: %d\n", sizeof(void *));
printf("size of 3 char: %d\n", sizeof(char_three));
printf("size of 3 int: %d\n", sizeof(int_three));
printf("size of a: %d\n", sizeof(a));
system("pause");
return 0;
}
O/P:
add1 of a is :51f828 add0 is :51f800
size of struct abc : 40
size of int: 4
size of double: 8
size of void ptr: 4
size of 3 char: 3
size of 3 int: 12
size of a: 80
Press any key to continue . . .
Вы не должны явно полагаться на sizeof () структур. Это зависит от реализации, вводит ли компилятор заполнение и, если да, то, где это происходит. Если вы используете GCC-совместимый компилятор и не обращаете внимания на другие цепочки инструментов (подождите, есть другие цепочки инструментов?), Вы можете использовать __attribute__((packed))
сказать компилятору вообще не добавлять отступы в вашу структуру.
Других решений пока нет …