C-sizeof和strlen區別,以及sizeof如何計算結構體大小
阿新 • • 發佈:2019-02-16
struct alt inf 編譯 style img com 大小 運行
sizeof和strlen區別
- sizeof是關鍵字,在編譯時就能計算出值,可以計算任何類型
- strlen是函數,只有在運行時才能去計算,且只能計算字符型的.
對於數組時,strlen是判斷’\0’為標誌結尾的,而sizeof則計算的是數組整個空間
示例如下:
char buf1[]="abcde"; char buf2[30]="ABC"; printf("buf1: %d %d\n",sizeof(buf1),strlen(buf1)); printf("buf2: %d %d\n",sizeof(buf2),strlen(buf2));
打印如下:
可以看到當我們的buf1沒有指定長度時,sizeof打印的是6,這是因為它把’\0’也包含進去了.
sizeof還可以計算類型大小,一般對於32位C程序而言,對應的long則為4字節
如下圖所示:
示例:
printf("char: %d\n",sizeof(char)); printf("short: %d\n",sizeof(short)); printf("int: %d\n",sizeof(int)); printf("long: %d\n",sizeof(long)); printf("long long: %d\n",sizeof(longlong)); printf("float: %d\n",sizeof(float)); printf("double: %d\n",sizeof(double));
打印如下:
sizeof計算結構體大小
計算機為了加快取讀結構體的內容速度,所以會對結構體進行字節對齊.
字節對齊的規律就是:結構體大小必須是最大成員的倍數(方便尋址)
示例1:
struct TestA{ short a; long b; //b=4, a=1,而5%4=1,所以會在a上面補齊3字節,所以s1=8 }; struct TestB{ char c; TestA d;int f; //c=1,d=8,f=4,而1+8+4=13,13%8=5,還差3字節,所以會在c上面補齊3字節, s2=16 }; int main() { printf("%d\n",sizeof(TestA)); printf("%d\n",sizeof(TestB)); }
打印如下:
示例2:
struct TestA { short a; long b; //s1=8,之前已經分析過 }; struct TestB{ char c; TestA d; long long f; //c=1,s1=8,f=8,由於8最大,且17%8=1,所以會在c上面補齊7字節,則s2=24 }; int main() { printf("%d\n",sizeof(TestA)); printf("%d\n",sizeof(TestB)); }
打印如下:
C-sizeof和strlen區別,以及sizeof如何計算結構體大小