sizeof()可以计算所有类型,strlen()仅计算字符串。
sizeof计算对象所占内存字节数,strlen()计算字符个数,遇到'\0'截止。
char *a;
char b[5];
sizeof(a) = 8 ; // 64位系统,8代表的是指针的大小,指针占8字节
sizeof(b) = 5 ; // 计算字符串数组的结果是真实的字符数组大小
//strlen(a) strlen(b) // 无固定值,因为strlen判断的唯一标准是'\0',
//它会根据a和b的指针看是一直向后找,知道碰到'\0',无论是不是自己字符串的结束标志'\0'。
char a =”Hello”;
sizeof(a) = 6; // /0
以指针形式定义的数组,和用[]定义的数组。为什么sizeof(数组名)的结果不同呢。
首先,我们看看sizeof是什么?是一个操作符,也是关键字,就不是一个函数,这和strlen()不同,strlen()是一个函数。
那么sizeof的作用是什么?
返回一个对象或者类型所占的内存字节数。
所以要看sizeof的对象是谁。
总结:
1. 未初始化的情况下,用strlen是不可行的,因为strlen的唯一标准是找‘\0’,记住这个就能明确strlen会执行处什么值
2. 初始化与否sizeof()的结果不不变,但是反应的并非真实字符串长度而是所占空间大小,所以memset初始化的时候用sizeof较好
3. char* 类型应特别注意,sizeof()计算出来的是指针大小,32位系统4字节,64位占8字节,与char*的字符串毫无关系,只有char[N]字符数组使用sizeof ()计算大小,结果是数组元素个数,而非指针大小,但是如果将其用于参数传递的话,子函数中获取的将不再是字符串数组类型,而是指针,这个要特别注意。
4. 系统函数返回值是char *类型的往往会在末尾加上'\0'。
5. 总归,初始化后strlen计算真实字符串大小不会出错,真实大小的判断方法是找'\0'。sizeof()结果与字符串真实大小无关,与初始化与否无关,计算的是变量所占空间。