https://blog.csdn.net/u011866460/article/details/39667371
sizeof()可以计算所有类型,strlen()仅计算字符串。
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"; // 此写法会有警告,但是为了测试方便此处就这么写了
char b[5];
memset(b,'\0',sizeof(b)); // 经典字符串初始化操作,会给字符数组的每一个值都赋值'\0'
sizeof(a) = 8: // 指针大小
sizeof(b) = 5; // 真实字符数组大小
strlen(a) = 5; // 真实字符串大小,一般的系统函数若返回值为char*类型,也会自动在末尾加上'\0',故在初始化后,strlen是可以用的
strlen(b) = 0; // 经过memset初始化后,全部内容都是‘\0’,strlen轮询第一个字符的时候就碰到'\0',故结果为0
总结: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()结果与字符串真实大小无关,与初始化与否无关,计算的是变量所占空间。