sizeof与strlen的区别

sizeof是一个关键字不是函数,发生在编译时刻。

sizeof是C/C++中的一个运算符,其作用是返回一个对象或者类型在内存中所占用的字节数。

    注意:sizeof后面如果是类型则必须加括号,如 sizeof(char);而如果是变量名则可以不加括号,如 sizeof a; 但是建议使用时  均加上括号。sizeof不能返回动态地被分配的数组的大小。

        总结如下,当参数分别如下时,sizeof返回的值表示的含义如下:
        数组——编译时分配的数组空间大小;
        指针——存储该指针所用的空间大小(在32位系统是4,在64系统是8);
        类型——该类型所占的空间大小;
        对象——对象的实际占用空间大小;
        函数——函数的返回类型所占的空间大小。函数的返回类型不能是void

strlen是C语言中的库函数,发生在运行时刻,所在头文件为#include <string.h>其函数原型为unsigned int strlen(char *s);

其中s为指定的字符串。

   注意:strlen只能用char *作为参数,它求的是字符串的实际长度,方法是从开始到遇到第一个'\0'结束。

sizeof只关心这块内存的大小,不关心这块内存存放了什么数据,

strlen只关心这块内存存放的数据,不关心这块内存的大小,直到遇到第一个NULL为止。

二、几个例子

例1:

    char str[20] = "0123456789";
    int a = strlen(str); /*a = 10*/
    int b = sizeof(str);/*b = 20*/

上面结果为a = 10,这是因为strlen计算的是字符串的实际长度,以第一个'\0'为结束符;

b = 20,这是因为sizeof计算的是分配的数组str[20]所占的空间大小,不受里面存储内容的影响。

例2:

    char *ss = "0123456789";
    int i = sizeof(ss); /*i = 4*/
    int j = sizeof(*ss); /*j = 1*/
    int k = strlen(ss); /*k = 10*/

上面结果为i = 4,这是因为sizeof获得的是一个指针的值所占的地址空间,为long int型的,占4个字节;

j = 1,这是因为 *ss 为第一个字符 '0' 所以占一个字节;

k = 10,这是因为strlen所获得的是此字符串的实际长度,所以要想获得此字符串的长度,则一定要用strlen

例3:

    char buffer[] = "Hello";
    int m = strlen(buffer); /*m = 5*/
    int n = sizeof(buffer); /*n = 6*/

上面结果为m = 5,这是因为strlen测量的是字符串的实际长度,以遇到的第一个'\0'为结束标志;

n = 6,这是因为字符串以'\0'为结束标志,'\0'也需要占用一个字节,所以sizeof测得的结果为6。

sizeof与strlen的区别

最后的sizeof计算的是指针(sizeof(char *)) 的大小,为4。

char* s = "0123456789";
sizeof(s);     //结果 4    ===》s是指向字符串常量的字符指针
sizeof(*s);    //结果 1    ===》*s是第一个字符
strlen(s);     //结果 10   ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前
strlen(*s);     //结果 10   ===》错误


char s[] = "0123456789";
sizeof(s);     //结果 11   ===》s是数组,计算到\0位置,因此是10+1
strlen(s);     //结果 10   ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前
sizeof(*s);    //结果 1    ===》*s是第一个字符

char s[100] = "0123456789";
sizeof(s);     //结果是100 ===》s表示在内存中的大小 100×1
strlen(s);     //结果是10  ===》strlen是个函数内部实现是用一个循环计算到\0为止之前

int s[100] = "0123456789";
sizeof(s);     //结果 400  ===》s表示再内存中的大小 100×4
strlen(s);     //错误      ===》strlen的参数只能是char* 且必须是以‘\0‘结尾的

char q[]="abc";
char p[]="a\n";
sizeof(q),  sizeof(p),  strlen(q),  strlen(p);  \\结果是 4 3 3 2

char p[] = {'a','b','c','d','e','f','g','h'};
char q[] = {'a','b','c','d,'\0','e','f','g'};
sizeof(p);     //结果是8 ===》p表示在内存中的大小 8×1
strlen(p);     //为一个随机值,结果与编译器有关,不同编译器结果一般不同
sizeof(q);     //结果是8 ===》p表示在内存中的大小 8×1
strlen(q);     //结果为4 ===》存在'\0',遇到'\0'计算停止。