結構體 記憶體空洞

2021-07-24 18:35:25 字數 635 閱讀 7443

結構體

作用:封裝資料。

結構體需要注意的是記憶體空洞問題

如下面的例子:

struct node ;

int main()

正常分析輸出結果應該為1+4+1=6;

可輸出結果為12;

因為第乙個char系統為它分配4個位元組,可它只用得到乙個位元組,剩餘3個閒置。

第二個是int型,佔四個位元組,前面只剩3個位元組,它不會填充到前面空間中,系統會重新分配給它四個位元組,這四個位元組被填滿了。

然後到第二個char,它不會填充到第乙個char型剩餘的3個位元組中,而是系統又為它分配4個位元組儲存空間,還是會有3個位元組閒置。

最後總共占用12個位元組。

如果修改一下

struct node;

則結果為8.

第一次分配4個位元組剩3個,第二個char會直接存入剩餘的3個位元組中,然後最後的int再分配4個位元組,總共8個位元組.

之所以每次以4個位元組為一組,是因為這是字對齊。如果把int換為short型,那系統每次分配的就是2個位元組為一組,這是半字對齊,當short與int同時出現,則是字對齊。

特殊情況:

struct node ;

這三個如果按此順序出現,則佔12位元組。

結構體內存

c語言中結構體占用記憶體問題 之前對結構體占用記憶體一直很混亂,到底是按照哪個變數型別計算記憶體?還是怎麼計算?下面先看乙個例子 struct str1 str1這個結構體占用的記憶體是多少呢?如果用變數型別直接想加,得到的結果是17,但顯然不是這樣的。這個程式執行的正確結果是24.為什麼呢?因為為...

結構體內存對齊

結構體內存對齊 一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這...

結構體內存對齊

一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...