我相信数组的大小是O(1)复杂度。
字符串是一个字符数组,但我听说strlen具有O(n)复杂度,扫描字符串直到终止null。为什么它也不是O(1)?
答案 0 :(得分:2)
sizeof
只根据类型声明获取大小。它并不关心内容,而是在编译时计算出来的。
strlen()
必须扫描数组以寻找空字节。这是O(n)
。
他们给出了不同的答案。
char s[1000] = "abc";
printf("sizeof = %d strlen = %d\n", sizeof s, strlen(s)); // prints 1000 and 3
strcpy(s, "1234567890123456789012345678901234567890");
printf("sizeof = %d strlen = %d\n", sizeof s, strlen(s)); // prints 1000 and 40
如果在字符串文字上调用strlen()
,编译器可以优化它并在编译时计算大小。因此strlen("foo")
可能是O(1)
。
答案 1 :(得分:0)
sizeof()
运算符完全由C编译器管理。编译完程序后,查看目标文件,看看所有sizeof()
都已转换为常量。
strlen()
从指定为参数的指针开始逐步进入内存,直到找到0x00
值NULL
)