我试图测试sizeof
和strlen
的差异,但我今天发现了一些奇怪的东西。
代码如下。
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char a[]={"I am a boy"};
char b[]={'I',' ','a','m',' ','a',' ','b','o','y'};
cout << "sizeof(a) = " << sizeof(a) << endl << "sizeof(b) = " << sizeof(b) <<endl;
cout << "strlen(a) = "<< strlen(a) << endl << "strlen(b) = " << strlen(b) << endl;
return 0;
}
结果如下:
sizeof(a) = 11
sizeof(b) = 10
strlen(a) = 10
strlen(b) = 11
我知道结果的前三行,但我不明白为什么strlen(b)
是11.有人可以帮助我吗?
答案 0 :(得分:6)
这只是运气。 strlen
获取指向char
的指针,并假设它是以空字符结尾的字符串的开头。它基本上向前迈进,直到找到\0
。数组\0
结束后很快就会出现b
,但实际上你正在调用 undefined behviour 。
答案 1 :(得分:2)
strlen
期望以null结尾的字符串。 b
不会以空值终止。未定义的行为结果。
答案 2 :(得分:0)
strlen
的参数必须是C风格的字符串。您的b
不是C风格的字符串。将不是C样式字符串的内容传递给strlen
会触发未定义的行为。这就是你观察到的。无论你从strlen(b)
(如果有的话)获得什么结果都是毫无意义的。
你的问题标题也颇具误导性。 &#34; strlen()和sizeof()&#34;之间的奇怪区别strlen
和sizeof
是该语言的两个完全不相关的功能,几乎没有任何共同之处。它们自然不同。这就是为什么将它们之间的任何观察到的差异称为&#34;怪异的&#34;是......好吧,很奇怪。
答案 3 :(得分:0)
sizeof()
告诉我们编译器对对象大小的了解(不一定是其内容)。
strlen()
在运行时从我们为其寻找零的地址遍历内存并计算它在找到之前经过的内存位置数。
答案 4 :(得分:0)
这不是很准确,可能导致误解,特别是因为(A)的尺寸不会给你13。
sizeof()是一个编译时表达式,为您提供类型或变量类型的大小。它并不关心变量的值。
strlen()是一个函数,它接受一个指向一个字符的指针,并从该字符开始遍历内存,寻找一个NUL字符。它会在找到NUL字符之前计算字符数。换句话说,它为您提供了C风格的NUL终止字符串的长度。
这两者在目的上完全不同,几乎没有任何关系。在C ++中,你不应该非常需要; strlen()用于C风格的字符串,应该用C ++样式的std :: strings代替,而C语言中sizeof()的主应用程序作为malloc(),memcpy()或memset等函数的参数。 ),你不应该在C ++中使用所有这些(使用new,std :: copy()和std :: fill()或构造函数)