1. 程式人生 > 其它 >sizeof和strlen詳解

sizeof和strlen詳解

一、sizeof

  1. 陣列宣告時有長度

    1. 沒有初始化

      char carr[5];
      int iarr[5];
      double farr[5];
      
      printf("%d\n", sizeof(carr));//5
      printf("%d\n", sizeof(iarr));//20
      printf("%d\n", sizeof(farr));//40
      
    2. 初始化(初始化數量不能超過陣列長度)

      char carr1[5]="abcde";
      char carr2[5] = { 'a','b','c' };
      int iarr[5] = {2,4};
      double farr[5] = {3.3,4.5};
      
      printf("%d\n", sizeof(carr1));//5
      printf("%d\n", sizeof(carr2));//5
      printf("%d\n", sizeof(iarr));//20
      printf("%d\n", sizeof(farr));//40
      
    3. 結論

      A、用字串初始化帶長度的字元陣列時,sizeof計算的陣列長度為宣告的陣列長度,與初始化字串無關。

  2. 陣列宣告時沒長度

    1. 沒有初始化

      不允許這種情況。

    2. 初始化

      char carr1[]="abc";
      char carr2[] = { 'a','b','c' };
      int iarr[] = {2,4};
      double farr[] = {3.3,4.5};
      
      printf("%d\n", sizeof(carr1));//4,用字串初始化字元陣列,包含字串結尾的空字元
      printf("%d\n", sizeof(carr2));//3,有三個字元,每個字元一個位元組,結果為3
      printf("%d\n", sizeof(iarr));//8,有兩個整形,每個整形4個細節,總共8個位元組
      printf("%d\n", sizeof(farr));//16,有兩個雙精度型,每個double佔8個位元組,總共16個位元組
      

二、strlen

  1. 陣列宣告時有長度

    1. 沒有初始化

      char carr[5];
      printf("%d\n", strlen(carr));//隨機值
      
    2. 初始化

      char carr1[5] = "abcd";//初始化字串長度小於字元陣列長度
      char carr2[5] = "abcde";//初始化字串長度等於字元陣列長度
      char carr3[5] = { 'a','b','c' };
      
      printf("%d\n", strlen(carr1));//4
      printf("%d\n", strlen(carr2));//隨機值
      printf("%d\n", strlen(carr3));//3
      
    3. 結論

      1. 初始化字串長度小於字元陣列長度,計算結果為\0之前的字元個數
      2. 初始化字串長度等於字元陣列長度,向字元陣列後面尋找\0,直到遇到\0字元為止,返回前面的字元個數。
  2. 陣列宣告時沒長度

    1. 沒有初始化

      不允許

    2. 初始化

      char carr1[] = "abcd";
      char carr2[] = { 'a','b','c' };
      
      printf("%d\n", strlen(carr1));//4
      printf("%d\n", strlen(carr2));//隨機值