Программа на C - Упаковка и выравнивание данных переменной структуры
Каким будет вывод программы на 32-битном компьютере (с использованием GCC)? Объясните.
#include<stdio.h>
int main() {
struct node {
int data;
struct node *link;
};
struct node *p, *q;
p = (struct node *) malloc(sizeof(struct node));
q = (struct node *) malloc(sizeof(struct node));
printf("%d, %d\n", sizeof(p), sizeof(q));
return 0;
}
Выход показывает
4, 4.
Связана ли вышеуказанная программа с выравниванием выравнивания элементов конструкции и упаковкой данных?
4 ответа
Нет, вы просто печатаете размер указателей. Это не связано с внутренней структурой элементов.
Пункт 1 Использование
%zu
спецификатор формата для вывода на печатьsizeof
типаsize_t
,Пункт 2 Обратите внимание на тип
p
, этоstruct node *
, такой же какq
,
Итак, по сути, sizeof(p)
а также sizeof(q)
точно так же, как sizeof(struct node *)
, которые на вашей платформе имеют 32-битную ширину. Так как здесь вы не рассматриваете переменную, выравнивание и отступы для структуры и элементов не имеют отношения к делу и не имеют отношения к этому случаю.
Тем не менее, пожалуйста, посмотрите, почему бы не бросить возвращаемое значение malloc()
и семья в C
,
В 32-битной системе хранимые адреса всегда имеют размер 32 бита. Если вы печатаете размер указателя, вы просто печатаете размер адреса, на который он указывает (32 Bit -> 4 Byte)
,
Если вы хотите узнать размер структуры, сделайте что-то вроде этого:
struct node p;
struct node q = {4, &p};
printf("%zu, %zu\n", sizeof(p), sizeof(q));
Нет, это не связано с заполнением выравнивания элементов конструкции и упаковкой данных.
Поскольку это 32-битный компьютер, размер любого указателя будет 4
байт. Поскольку р и q имеют тип struct node *
т.е. указатель на struct node
результат печатает размер указателей p
а также q
,