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));//随机值
      

相关