[日期: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...