1. 两者都以字节为单位计算长度。sizeof是操作符,strlen是函数。有什么区别呢?sizeof是在程序编译的时候计算参数占用的字节数,而strlen是在程序执行过程中计算字符串占用的字节数。
  2. strlen只能用于计算字符串的长度。它的机制是从字符串开始计算,遇到结束符('\0',ASCII码值为0)就停止计算,不包括结束符占用的一个字节空间。也就是说,要使用strlen()函数计算长度,那么有两个必须的条件:参数必须是字符串;字符串必须包含字符串结束符。如果两个条件有一个不符合,就不能使用该函数。
  3. sizeof适用范围比strlen广,它会计算对象实际占用的内存字节数。但是sizeof在给指针使用的时候需要注意一下。指针本身是一个无符号整数,所以不管指针指向什么类型,给指针使用sizeof返回的值都是4(32位系统上)。还有,sizeof用于类型时必须使用括号,但用于具体的变量时,可以省略括号,但是在任何时候使用括号,都是一个好习惯。

下面用一个例子来说明上面说的点:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char str1[] = "Test";
    char str2[4] = {'T', 'e', 's', 't'};
    char str3[10] = "Test";
    char str4[10] = { 1, 2, 4, 5, 6, 0, 9, 8, 3, 3};
    char *str5 = "TestTest";

    int *p6;
    float *p7;
    double *p8;

    printf("strlen(str1):%d\tsizeof(str1):%d\n", strlen(str1), sizeof(str1));
    printf("strlen(str2):%d\tsizeof(str2):%d\n", strlen(str2), sizeof(str2));
    printf("strlen(str3):%d\tsizeof(str3):%d\n", strlen(str3), sizeof(str3));
    printf("strlen(str4):%d\tsizeof(str4):%d\n", strlen(str4), sizeof(str4));
    printf("strlen(str5):%d\tsizeof(str5):%d\n", strlen(str5), sizeof(str5));

    printf("sizof(p6):%d\nsizeof(p7):%d\nsizeof(p8):%dn", sizeof(p6), sizeof(p7), sizeof(p8));

    return 0;
}

程序运行结果如下:

strlen(str1):4  sizeof(str1):5
strlen(str2):6  sizeof(str2):4
strlen(str3):4  sizeof(str3):10
strlen(str4):5  sizeof(str4):10
strlen(str5):8  sizeof(str5):8
sizof(p6):8
sizeof(p7):8
sizeof(p8):8

分析如下:

  1. str1的初始化方式,会在字符串的最后面自动加一个字符串结束符,所以使用strlen返回值是4,使用sizeof返回值是5(包含结束符占用的一个字节)。
  2. str2的初始化方式,字符串是没有结束符的。所以是不能对这种不包含结束符的字符串使用strlen函数的,这里返回值是8,但是这个值是没有任何意义的,使用不同的编译器返回的值不一样。但是使用sizeof却可以正常工作,返回值是4。
  3. str3的初始化方式会在前4个字符处用Test填充,但其余的会自动置为0,也就是字符串结束符。所以使用strlen返回4。但是其实str3真正分配的内存是10个字节,所以使用sizeof返回值是10.
  4. str4使用几个整数初始化,因为char类型在计算机内部是按照int型来存储和处理的,只是可以表示的范围比int小而已。使用strlen返回值是5,因为它检测到第6个变量的时候检测到了0,0是结束符的ASCII码,所以她就认为到了字符串的结尾,后面就被忽略掉了。使用sizeof依旧返回实际分配的内存。
  5. str5的初始化方式,依旧会在字符串结尾加结束符,所以使用strlen返回值为8。但是sizeof返回值确是4。很多时候我们都可以认为char*char []是等价的,但在有些情况下,两者是不相同的。就比如说该例,对*str5使用sizeof,其实求的是指针这个类型的长度。前面介绍过,指针实质是无符号整型,所以返回值是4,后面的几个指针的输出也说明了这个问题。