用對齊原則求結構體長度

2021-05-21 22:13:57 字數 2358 閱讀 9233

[日期:2009-09-18]

[字型:大 中 小]

1. 熟悉win32下vc6.0各種基本資料長度:

size of int is: 4

size of char is: 1

size of short int is: 2

size of double is: 8

size of unsigned int is: 4

size of float is: 4

size of long double is: 8

size of long int is: 4

size of long int is: 4

size of unsigned char is: 1

size of signed char is: 1

size of unsigned long int is: 4

size of signed int is: 4

size of unsigned short int is: 2

size of signed short int is: 2

size of signed int is: 4

size of signed long int is: 4

sizeof 指標 is 4;

2. 結構體長度求法:

a.成員都相同時(或含陣列且陣列資料型別同結構體其他成員資料型別):

結構體長度=成員資料型別長度×成員個數(各成員長度之和);

結構體中陣列長度=陣列資料型別長度×陣列元素個數;

b.成員不同且不含其它結構體時;

(1)分析各個成員長度;

(2)找出最大長度的成員長度m(結構體的長度一定是該成員的整數倍);

(3)並按最大成員長度出現的位置將結構體分為若干部分;

(4)各個部分長度一次相加,求出大於該和的最小m的整數倍即為該部分長度

(5)將各個部分長度相加之和即為結構體長度

c含有其他結構體時:

(1)分析各個成員長度;

(2)對是結構體的成員,其長度按b來分析,且不會隨著位置的變化而變化;

(3)分析各個成員的長度(成員為結構體的分析其成員長度),求出最大值;

(4)若長度最大成員在為結構體的成員中,則按結構體成員為分界點分界;

其他成員中有最大長度的成員,則該成員為分界點;

求出各段長度,求出大於該和的最小m的整數倍即為該部分長度

(5)將各個部分長度相加之和即為結構體長度

舉例來說:

1.struct test1

{ int a;

int b[4];

sizeof(test1)=sizeof(int)+4*sizeof(int)=4+4*4=20;

2. struct test2

{ char a;

int b;

double c;

bool d;

分析:該結構體最大長度double型,長度是8,因此結構體長度分兩部分:

第一部分是a、 b、 c的長度和,長度分別為1,4,8,則該部分長度和為13,取8的大於13的最小倍數為16;

第二部分為d,長度為1,取大於1的8的最小倍數為8,

兩部分和為24,故sizeof(test2)=24;

3. struct test3

char a;

test2 bb;//見上題

int cc;

分析:該結構體有三個成員,其中第二個bb是型別為test2的結構體,長度為24,且該結構體最大長度成員型別為double型,以後成員中沒有double型,所以按bb分界為兩部分:

第一部分有a 、bb兩部分,a長度為1,bb長度為24,取8的大於25的最小倍數32;

第二部分有cc,長度為4,去8的大於4的最小倍數為8;

兩部分之和為40,故sizeof(test3)=40;

4. struct test4

char a;

int b;

struct test5

{ char c;

test4 d;

double e;

bool f;

求sizeof(test5)

分析:test5明顯含有結構體test4,按例2容易知道sizeof(test4)=8,且其成員最大長度為4;則結構體test5的最大成員長度為8(double 型),所以e是分界點,分test5為兩部分:

第一部分由c 、d、e組成,長度為1、8、8,故和為17,取8的大於17的最小倍數為24;

第二部分由f組成,長度為1,取8的大於1的最小倍數為8,

兩部分和為32,故sizeof(test5)=24+8=32;

在vc6.0下程式驗證 結果是正確的。

閱讀:20 次

C語言中結構體長度計算

結構體的長度並不是簡單地將結構體地所有成員相加 它中間會出現偏移量,我們以下為例 現有如下結構體 struct good 我們假設初始位址開始為0 c的長度為1,0可以整除1,當c填充到記憶體後位址加1,即此時到了位址為1的位置 id的長度為4,位址位置1不可以整除4,所以在c填充到記憶體時需要加3...

C 顯示純文字對齊封裝(控制顯示字型長度)

坑 使用者在寫多行的純文字上來了乙個對齊的 如下 原因 不同的字型下,中文,英文大寫,英文小寫,字元,尤其是空格。字型占用的長度是不一樣的,然後顯示出來就是亂的。然而客戶要求在不同的字型下要正確對齊。所以只能根據字型去算每個字元的畫素,然後使用空格對齊了。做了乙個封裝,但是要求輸入轉換為datata...

C 踩坑記錄 struct 結構體長度問題

下面的結構體總共11個位元組,但通過marshal.sizeof headdata 獲取到的是12個位元組 system.serializable public struct headdata 主要原因是 結構體出於效率原因,結構會被進行優化和對齊。如果對齊的邊界是2個位元組,那麼marshal.s...