数组的复杂性与字符串长度

时间:2018-04-13 02:25:46

标签: c

我相信数组的大小是O(1)复杂度。

字符串是一个字符数组,但我听说strlen具有O(n)复杂度,扫描字符串直到终止null。为什么它也不是O(1)?

2 个答案:

答案 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()从指定为参数的指针开始逐步进入内存,直到找到0x00NULL