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


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

打印如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM