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计算的是指针(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'计算停止。