詳細解釋如何計算乙個結構體的大小?

2021-09-11 02:26:05 字數 769 閱讀 7052

1.陣列下標可為負:a[-1]  相當於  a+(-1);

2.聯合體大小就是成員中最大型別的大小;

例如:struct test*p;

總結計算大小規則:

首先4+8=12>8,即編譯器寬度(即指標所佔大小:8)存放不下,故第乙個成員補全為編譯器寬度為8位元組,(需保持和下一成員位址對齊,如果當前幾個資料成員位址實現對齊,則從下乙個成員為起點再重複以上規則))

接下來:short  date 占用2位元組,char ch 占用1位元組     2+1=3位元組,乙個位址寬度能放下,但8+8+3=19不是8的倍數,故需要補齊,其實就是再補5個位元組,故此結構體大小為:24位元組

注意:如何補?補幾個位元組,取決於編譯器寬度,和其中占用記憶體大小最大的成員,如過超過編譯器寬度,以其資料成員所佔記憶體大小為對齊基準,否則補齊到編譯器寬度即可

struct test*p;
以上結構體多大呢?  答案:4位元組 (沒有達到編譯器寬度,以最大成員對齊)

再來個例子:

struct testtest;
答案:24  每對其一次,從當前開始對齊,小於編譯器寬度以當前 最大元素對齊

8: 4+補齊4

8:8(4+8=12 >8,但不是8倍數,故上面元素需補齊4)

8:2+1+補齊1  + 4

總和:剛好24 不用再補齊

ICE如何傳遞乙個結構體指標

比如函式為 struct void get s 這種c中的方式在ice slice語言中是不能實現的 因為ice slice語言函式不接受結構體指標 所以可以吧 定義為類 class 即便是這樣也不能直接定義void get s 來傳遞乙個類指標 因為ice會把這個slice函式重新定義 用slic...

乙個結構體的示例

定義乙個結構體teacher型別,然後宣告乙個teacher陣列 teacher包含名字和資料.teacher陣列元素在堆空間開闢 然後輸入名字年齡,接下來列印輸入的內容,再然後釋放開闢堆的記憶體 如下 include stdafx.h include include include define ...

無名結構體的乙個妙用

可以定義無名結構體型別的變數。編譯器對無名結構體的處理是隨機生成乙個不重複的變數名。無名結構的定義方式就是定義無名結構體時必須定義該結構體型別的至少乙個變數。無名結構體的妙用就是可以避免相同型別的結構體的重複定義。例如實現乙個佇列,佇列元素型別未知。我們希望把佇列的對頭指標 對尾指標儲存在乙個結構體...