STRUCT的記憶體

2021-08-25 05:53:28 字數 1432 閱讀 2436

在c語言中,結構體的記憶體是由先到後順序占用空間的。

先定義的在低位址,後定義的在高位址。位址採用空間對其策略。

其實這是一篇問題貼,一直沒有弄懂是什麼問題!!!

在結構體內存中

結構體首元素位址和結構體首位址一致。(c++不一致),c++中,一般會空出開始的4位元組,為了區別物件位址,和第乙個成員的位址。通常是1位元組,但是位元組對齊的時候,就占用了4位元組。

實際上,你看到sizeof(空結構體) =4.

但是,首位址會影響後面的位址。

typedef structstu;stu s=;printf("%d\n",sizeof(stu));printf("%p\n",&(s.a));printf("%p %p %p %p\n",s,  &s,     &(s.a), &(s.c));printf("%p %p %p %p\n",&s, &(s.a), &(s.b), &(s.c));printf("%p %p %p %p\n",s,  &(s.a), &(s.b), s.c);printf("%p %p %p %p\n",s,s,s,s);
輸出結果為:

200x7ffd6f9339300x7ffd6f933930 0x7ffd6f933930 0x7ffd6f933935 0x7fa7a85b49380x7ffd6f933930 0x7ffd6f933930 0x7ffd6f933934 0x7ffd6f9339350x7ffd6f933930 0x7ffd6f933934 0x7ffd6f933935 0x7fa7a85b49380x7fa7a8b4b000 0x7fa7a8928a00 0x7fffffc1     0x7fa7a85b4938
相似的還有好多問題,越是實驗,腦子就越亂,感覺以前知道的東西都不模糊了,實驗了不知多少次後,我徹底暈了,以前的不會了,現在這個問題也沒找到問題所在。

但是我發現了一處詭異:

就是在用得到 s(結構體名)時,後面的輸出都會變得莫名其妙,無處可尋。

大家看到我這個帖子時,一定要給我講解講解,感激不盡!!!

struct的記憶體布局

這段 的輸出結果是多少?4 1 5?那你就錯了 是8!為了cpu取數方便,提高效率,編譯器一般會把資料安排到合適的位置 一般數在記憶體中存放的起始位址都是4的倍數,稱為 4位元組對齊 所以在這裡,char雖然只佔1位元組,但是後面也給它填充3個位元組,湊夠4個位元組 struct s struct ...

struct的記憶體對齊

結構體位元組對齊能減少記憶體占用,提高記憶體訪問效率。不論在x86或arm處理器上c的每種型別儲存都會要求記憶體對齊,除char以外。結構體中不能包含結構體本身,但可以包含指標。由於平台原因對齊大小不同,可能同乙個結構體得到的大小會不同,但一般的對齊規則如下 chars可以從任何位元組位址開始,2位...

struct記憶體布局

結構體的記憶體分配原則原則1 資料成員對齊規則 結構 struct或聯合union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始 比如int在32位機為4位元組,則要從4的整數倍位址開始儲存 原則2 結構體作為成員 如果乙個結構裡有某...