Программа на 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,

Другие вопросы по тегам