c語言中結構體在記憶體中的儲存方式

2022-01-16 06:54:01 字數 1426 閱讀 2851

1樓:吉祥二進位制

結構體在記憶體中的儲存方式,和常規的c語言變數、常量儲存方式類似,唯的不同在於對齊。

只所以要進行資料對齊是因為編譯器對結構的儲存的特殊處理能提高cpu儲存變數的速度,一般來說,32位的cpu記憶體以4位元組對齊,64位的cpu的以8位元組的對齊。一般可以使用#pragma pack()來指出對齊的位元組數。比如下面的**,在debug會顯示結構體test的記憶體大小為28,如果生成release版則所佔記憶體大小為32 。

#include

#ifdef _debug

#pragma pack(4)

struct test

ss;#else

#pragma pack(8)

struct test

ss;#endif

int main(void)

2樓:

分配為記憶體時相鄰記憶體之向要儲存記憶體管理資料結構的資料,不會兩次分配的記憶體地址相連的即使分配的地址是相鄰的記憶體,多次分配記憶體後,通常都不會出現連續分配相鄰地址的現象,分配的記憶體地址當然絕對不會連續了。

3樓:風林焱山

用malloc()申請的函式應該指的是不一定在記憶體的哪一個地方為你分配了一個儲蓄資料的空間,但空間裡的內容應該是連續的,不然呼叫時不是很亂嘛!

4樓:傲世修羅王

那要看這個結構體定義在什麼地方,也要看它包含的變數的型別。

5樓:匿名使用者

1. p1的10個空間是連續的,p2的20個空間也是連續的,因為malloc分配時就考慮到連續分配的問題。

2. p1,p2之間的地址不一定是連續的。因為p2申請地址時,重新調了malloc()。也就是從隨機的地址開始連續分配20個空間。

3. 注意1.2裡[空間]的意思,因為申請的資料型別不一樣,比如char型,int型。

所以每個空間的長度也不一樣。假如int型佔用2個byte,則地址0x1000的下一個地址有可能就是0x1002。因為0x1000+0x1001是一個int型資料。

4. 初學者可不看本條。再深入點,跟據編譯器不同,一個int型佔2byte還是4byte都有可能。具體情況具體分析。

6樓:帥哥聯盟

malloc本身申請的記憶體是連續的,比如malloc(11),他申請了11個連續的記憶體單元。

你說的「『堆』記憶體不連續」,這句話很籠統,那要看那個『堆』具體是如何實現的。你可是設計一個連續記憶體的堆,也可以設計連結串列型別的堆

c中變數的儲存方式,最終是由編譯器決定的,不同的語言,組織方式都不一樣。

--------------------------------

想有深入的理解,可以學習彙編,觀察彙編程式最終生成的執行檔案,記憶體使用和組織方式。。。之後,心裡基本就有低了。。這些一句話解釋不清,還有一個漫長的學習過程

設c語言中int型資料在記憶體中佔位元組則

最大值就是 16個二進位制1 1111111111111111 轉換為十進位制 的數值,也就是65535 最小值就是 0 範圍就是 0 65535 0 2的16次方減1,一個位元組8位,兩個16位 int 佔2個位元組 16位 範圍抄為 32768 32767long int 佔4個位元組 32位 ...

C語言的指標變數在記憶體中佔多少位元組

一個指標變數在記憶體中佔兩個位元組 small模式編譯 一個指標變數在記憶體中佔四個位元組 32位機器上 一般都是32位機器的,所以四個位元組咯。c語言的指標變數在記憶體中佔多少位元組?一個指標變數在記憶體中佔兩個位元組 small模式編譯 一個指標變數在記憶體中佔四個位元組 32位機器上 一般都是...

C語言與C 結構體的區別,C語言和C 語言的區別是什麼?

c語言的結構就是值型別,跟int,char沒有什麼區別 c 的結構跟類已經非常接近了,就是如果不具體說明,預設為共有 比如說這個結構體吧.struct mystruct str 在c 裡可以這樣用 mystruct s1 mystruct 就是一個型別,在c裡只能這樣用其 struct mystru...