Вопрос относительно распределения памяти для переменных в структуре (В C)

Возможный дубликат:
Почему sizeof для структуры не равен сумме sizeof каждого члена?

#include <stdio.h>

int main(){

struct word1{
 char a;
 int b;
 char c;
};

struct word2{
 char a;
 char b;
 int c;
};

printf("%d\t%d\n", sizeof(int), sizeof(char));   //Output : 4 1
printf("%d\t%d\n", sizeof(struct word1), sizeof(struct word2)); //Output: 12 8
return 0;
}

Код доступен на IDEONE.

Почему размер структуры 1 (слово1) больше, чем размер структуры 2 (слово2)?

Это проблема компилятора?


person Chankey Pathak    schedule 24.10.2010    source источник
comment
Не используйте "void main()" и ожидайте, что вас не заметят - правильный тип возврата для main() - int.   -  person Jonathan Leffler    schedule 24.10.2010
comment
однажды кто-то заявит, что возвращение void вместо int вызвало ядерный расплав или что-то в этом роде.   -  person Crashworks    schedule 24.10.2010
comment
Хорошо, я позабочусь об этом в следующий раз.   -  person Chankey Pathak    schedule 24.10.2010
comment
@Crashworks: может быть, но не мной. Это означает, что в среду не возвращается надежное значение, поэтому, если программа A полагается на статус выхода программы B, не определено, какое значение A получит от B, если B не вернет значение. Теперь, если программы находятся где-то рядом с ядерной установкой, можно предположить, что проверка кода, стандарты тестирования и кодирования гарантируют, что катастрофы не произойдет. Если новички научатся возвращать значение из main (), это поможет им подготовиться к работе в более сложных условиях, чем классные упражнения. В конце концов, они должны прочитать стандарт C, но пока нет.   -  person Jonathan Leffler    schedule 24.10.2010
comment
Должно быть, это один из самых повторяющихся вопросов по теме на Stack Overflow.   -  person dmckee --- ex-moderator kitten    schedule 24.10.2010
comment
@ Джонатан Леффлер, я все время использую void main(void). Сохраняет несколько байтов ПЗУ и ОЗУ на AVR.   -  person Vorac    schedule 25.04.2013
comment
@Vorac: если вы работаете в автономной среде или если размещенная среда специально поддерживает void main(), тогда все в порядке. Однако в общем вопросе C, подобном этому (тот, который не предусматривает автономную среду), использование void main() - плохая практика; отсюда и мой комментарий.   -  person Jonathan Leffler    schedule 25.04.2013


Ответы (2)


int, вероятно, требует четырехбайтового выравнивания, поэтому в первом случае к обоим элементам char нужно добавить три байта заполнения, но во втором случае вам нужно только два байта заполнения после второго элемента char (потому что char имеет выравнивание в один байт).

word1 выглядит так:

0   |1   |2   |3   |4   |5   |6   |7   |8   |9   |10  |11
a   |  (padding)   |b                  |c   |  (padding)

word2 выглядит так:

0   |1   |2   |3   |4   |5   |6   |7
a   |b   |(padding)|c               
person James McNellis    schedule 24.10.2010

Дело 1:

  0    1    2    3    4  
+---------------------+
| a    | Unused       |      4 bytes
+---------------------+

  0    1    2    3    4 
+---------------------+
|       b             |      4 bytes
+---------------------+

  0    1    2    3    4 
+---------------------+ 
| c    | Unused       |      4 bytes
+---------------------+

Итого: 12

Случай 2:

  0    1    2    3    4 
+---------------------+
| a   | b   | Unused  |      4 bytes
+---------------------+

  0    1    2    3    4 
+---------------------+
|       c             |      4 bytes
+---------------------+

Итого: 8

P.S: Structure Padding определяется реализацией.

person Prasoon Saurav    schedule 24.10.2010