Памер звязанага спісу вузлоў

Я лічу, гэта справа крыху больш складана і рэкурсіўнай адносна таго, як 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 сутыкнуўся з тым жа структурамі ll_core. Так што гэта свайго роду цыкл або рэкурсіі пры разліку памеру. Калі ласка, прабачце мяне і дайце мне ведаць, калі я прапускаю любую асноўную рэч у маёй галаве, думаючы, як гэта.

2

7 адказы

Ён не мае патрэбу ў памеры структуры зноў, так як структура ня ўтрымлівае паказальнік у структуры, а не сама-структуру.

Памер «паказальніка структура ll_core » не мае нічога агульнага з памерам структура ll_core , яны ўяўляюць сабой два розных тыпу. Адным з іх з'яўляецца паказальнікам, а другі адзін няма.

Вы не можаце абвясціць «сапраўды» рэкурсіўная структуру дадзеных, так як гэта было б бясконцым.

3
дададзена
<�Р>, таму што даданне памераў асобнага элемента структуры яго Agains сутыкнуліся з той жа STRUCT ll_core .

Не, ён сустракае Паказальнік у структура ll_core . Калі ён сутыкнуўся з STRUCT сябе, што прывяло б да бясконцых памерах. Кампілятар ведае патрабаванні да памеру і выраўноўванню STRUCT ll_core * нават нічога ня ведаючы пра STRUCT ll_core , таму ён можа дадаць памеры членаў плюс запаўненне неабходных для выраўноўвання (у наступны член у дадзеным выпадку), каб знайсці памер структура 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;
};
2
дададзена
struct ll_core
{
    char c_ll;
    struct ll_core * next;
};

sizeof operator adds the size of the member of the structure ll_core. Here it is a character (c_ll) and a pointer(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 (паказальнік)

Edit - З вашага пытання, здаецца, вы працуеце на 32-бітнай машыне. У 32-бітнай машыне, дадзеныя будуць прачытаныя і запісаны як 4 байта кавалкі.

1
дададзена
Так адбываецца гэты адказ, і ўсе іншыя, я разумею, што 32 біт машына (шахта 32 біт, а) счытвае/запісвае дадзеныя ў 4-байтавая кавалках, што робіць гэтую структуру як: (c_ll + 1 байт 3byte кажухамі) - 4 байта структура ll_core * наступны - 4 байта Такім чынам, даданне да 8 байт .. !!
дададзена аўтар Diwakar Sharma, крыніца
так, гэта правільна
дададзена аўтар Sanish, крыніца

Вы не хапае пункту, уважліва ... «побач» гэта проста паказальнік. вы не можаце зрабіць толькі «STRUCT ll_core наступны» .. гэта значыць без *. Такім чынам, да таго часу, як гэта паказальнік. Памер будзе разлічвацца памер толькі паказальніка. Увогуле, памер паказальніка 4.

Калі ў вас ёсць якая-небудзь блытаніна, выдаліце ​​<�моцны> * з <�моцнага> наступнай і паспрабаваць скампіляваць код.

0
дададзена

Многія працэсары працуюць лепш, калі пэўныя тыпы выраўноўваюцца па пэўных адрасах. Гэта азначае, што кампілятар падушачкі структуру пасля аднаразовага сімвал элемент так, каб паказальнік на роднай мяжы слова.

Што тычыцца «рэкурсіі» ў структуры, не існуе ні таму, што наступны поле з'яўляецца паказальнік ў структуры, а не саму структуру.

0
дададзена

Там 2 элементы з'яўляюцца голец (памер 1) і паказальнік (памер 4), так што можна падумаць, што памер будзе 5, але структуры дапаўняюцца да 4 байт (памер слова). Сімвал дапаўняецца да 4 байт, даючы ў агульнай складанасці 8.

0
дададзена