sizeof和strlen區別 sizeof是關鍵字,在編譯時就能計算出值,可以計算任何類型 strlen是函數,只有在運行時才能去計算,且只能計算字元型的. 對於數組時,strlen是判斷’\0’為標誌結尾的,而sizeof則計算的是數組整個空間示例如下: 列印如下: 可以看到當我們的buf1沒有 ...
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(long long)); 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)); }
列印如下: