1. 程式人生 > >C-sizeof和strlen區別,以及sizeof如何計算結構體大小

C-sizeof和strlen區別,以及sizeof如何計算結構體大小

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(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));
}

打印如下:

技術分享圖片

C-sizeof和strlen區別,以及sizeof如何計算結構體大小