2013-05-27 3 views
2

Я нахожу эту вещь немного сложной и рекурсивной относительно того, как оператор sizeof вычисляет размер одного узла в связанном списке. Я ниже структура, как один узел в списке, например:Размер узла связанного списка

struct ll_core 
{ 
    char c_ll; 
    struct ll_core * next; 
}; 

printf("size of struct ll_core = %d\n\n",sizeof(struct ll_core)); 

это дает мне ответ 8. Теперь, как он решает размер 8, так как добавление размеров отдельного элемента структуры его Agains сталкивается с тем же struct ll_core. Так что это своего рода цикл или рекурсия при вычислении размера. Пожалуйста, извините меня и сообщите мне, если я пропущу какую-либо основную вещь в голове, думая так.

ответ

2

Предполагая, что вы используете свой код на 32-битной машине, размер указателя будет 4 байта. Поскольку структура будет выровнена по границе слова, будут добавлены 3 байта, и размер будет 8 байтов.

эта структура будет на самом деле, как,

struct ll_core{ 
    char  c_11: 
    char const byte[3]; //padded bytes for alignment reasons 
    struct ll_core *next; 
}; 
3

Не требуется размер структуры снова, поскольку структура содержит только указатель для структуры, а не для самой структуры.

Размер "указатель struct ll_core" не имеет отношения к размеру struct ll_core, они представляют собой два разных типа. Один - указатель, другой - нет.

Вы не можете объявить «истинно» рекурсивную структуру данных, поскольку она будет бесконечной.

2

потому что для добавления размеров отдельных элементов структуры он снова сталкивается с тем же struct ll_core.

Нет, он встречает указатель к struct ll_core. Если бы он столкнулся с самой структурой, это привело бы к бесконечным размерам. Компилятор знает требования к размеру и выравниванию struct ll_core *, даже не зная ничего о struct ll_core, поэтому он может добавлять размеры элементов плюс отступы, необходимые для выравнивания (из этого члена next), чтобы найти размер struct ll_core.

0

Многие процессоры работают лучше, если определенные типы выровнены по определенным адресам. Это означает, что компилятор заполняет вашу структуру после единственного элемента char, чтобы указатель находился на границе родного слова.

Что касается «рекурсии» в структуре, не существует ни потому что next поле является указатель к структуре, а не сама структура.

0

вам не хватает точки, внимательно посмотрите ... «next» - это просто указатель. вы не можете сделать только «struct ll_core next», то есть без *. Итак, пока это указатель. Размер будет рассчитываться только для размера указателя. В общем, размер указателя равен 4.

Если у вас есть какая-либо путаница, удалите * из следующего и попытаться скомпилировать код.

0

Там 2 элемента - это символ (размер 1) и указатель (размер 4), поэтому вы думаете, что размер будет 5, а структуры дополняются 4 байтами (размер слова). Символ заполняется до 4 байтов, давая в общей сложности 8.

1
struct ll_core 
{ 
    char c_ll; 
    struct ll_core * next; 
}; 

sizeof оператор добавляет размер члена структуры ll_core. Здесь это символ (c_ll) и указатель (next).

Немного больше информации о том, как рассчитывается размер.

Структура Набивка:

В 64 битной системе, данные будут считывать и записывать как 8 байт куски. Поэтому, когда вычисляется размер структуры, происходит заполнение. Средство компилятора добавит некоторые промежутки между членами структуры, чтобы «выровнять» границы границ архитектуры. Что-то следующее:

struct ll_core 
{ 
    char c_ll; 
    /* 7 bytes of padding */ 
    struct ll_core * next; 
}; 

Таким образом, размер этой структуры в 64-битной системе будет 16 байт.

Структура упаковка:

Вы можете запретить компилятор делать структуру отступов, делая структуру упаковки. В GCC это делается следующим образом:

struct __attribute__((__packed__)) ll_core 
{ 
    char c_ll; 
    struct ll_core * next; 
}; 

Теперь размер будет равен 9 байтам на 64-битной машине.

sizeof(char) + sizeof(pointer)

Edit - Из вашего вопроса, кажется, вы работаете на 32-битной машине. В 32-разрядной машине данные будут считаться и записываться как 4 байтовые фрагменты.

+0

Итак, переходя к этому ответу и всем остальным, я понимаю, что 32-битная машина (моя тоже 32-разрядная) читает/записывает данные в 4 байтовых фрагментах, что делает эту структуру похожей: (c_ll 1byte + 3byte padding) - 4bytes struct ll_core * next - 4bytes Следовательно добавление до 8 байт. !! –

+0

да, это правильно – Sanish

Смежные вопросы