strlen()和sizeof()区别
目录
区别
strlen()和sizeof()在计算时的大小
1.'\\0'的情况
2.'\\n'的情况
指针的特殊性
sizeof()在数组中的使用
总结
区别
- sizeof()是操作符,strlen()是库函数
- sizeof的参数可以是数据类型,也可以是变量;strlen()的参数只能是以'\\0'结尾的字符串
- 编译器在编译时就计算了sizeof的结果,而strlen()必须运行时才能计算出来
- sizeof是数据类型占内存的大小;strlen()是字符串实际的长度
- 数组作为sizeof的参数时,不退化,作为strlen的参数时要退化为指针
strlen()和sizeof()在计算时的大小
1.'\\0'的情况
strlen()计算时,会到'\\0'的位置停下来不再计算,不会把'\\0'计算入内。但是如果'\\0'后面有数字时,这个时候'\\0'已经不是'\\0'而是一个八进制的数,strlen()遇到后不会当作'\\0'来处理。
sizeof()遇到'\\0'不会停下,sizeof会把字符串结尾处的'\\0'读取到,计算在长度内。
结合例题理解
int main()
{char str[] = "abc\\012abcdef";char str1[] = "abcdefg";char str2[] = "abc\\0abc";cout << sizeof(str) << endl;cout << strlen(str) << endl;cout << sizeof(str1) << endl;cout << strlen(str1) << endl;cout << sizeof(str2) << endl;cout << strlen(str2) << endl;
}
解答:
\\0 +数字 = 八进制 因此,/012=8+2=10
注意,八进制输出就是1位,不是说八进制的10输出位数位数就是两位
2.'\\n'的情况
- strlen()不会读取'\\n'
- sizeof()会读取‘\\n’
字符串以‘\\n’结尾就不会再以‘\\0’结尾了
strlen()为下图所示,sizeof()还需要加上结束符'\\0',即为9
有个误区是,会以为以‘\\n’结尾就就不再往后读取了,但是\\n并不会作为字符串的结束符,字符串结束符只能是\\0
指针的特殊性
sizeof(指针)大小是固定的,并不跟指针指向的内存空间相关
指针在X64 64位平台上,大小为8,X86 32位平台上大小为4
用指针对字符串输出时:
printf("%s",src);//%s可以直接输出字符串,遇到\\0停止,不需要循环
补充:如果malloc开辟空间
需要malloc(srlen(src)+1);加1为’\\0‘分配空间
sizeof()在数组中的使用
原文链接:sizeof()在数组中的使用
总结
- strlen()不会读取'\\0'
- sizeof()会读取‘\\0’
- \\0 +数字 = 八进制,占1位
- strlen()会读取'\\n'
- sizeof()会读取‘\\n’
- sizeof(指针)
- X86 32位 =4
- X64 64位=8
-
如果malloc开辟空间,需要malloc(srlen(src)+1);加1为’\\0‘分配空间
-
用指针对字符串输出时,printf("%s",src);//%s可以直接输出字符串,遇到\\0停止,不需要循环
-
一维数组arr[]:
-
sizeof(arr) ->数组总字节
-
sizeof(arr[0]) ->第一个元素字节数,或者说是单个元素的大小
-
-
二维数组brr[][]
-
sizeof(brr) ->数组总字节数,即行和列元素总个数*定义类型的大小
-
sizeof(brr[0]) ->第一行元素的总字节数
-
sizeof(brr[0][0]) ->单元格类型所占字节数与一维数组arr[0]含义一致,单个元素的大小。
-