Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 数组与字符串长度的复杂性_C - Fatal编程技术网

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

C 数组与字符串长度的复杂性,c,C,我相信数组的大小是O(1)复杂度 字符串是一个字符数组,但我听说strlen的复杂性是O(n),它扫描字符串直到终止为null。为什么它不是O(1)?sizeof()操作符完全由C编译器管理。编译完程序后,查看对象文件,查看所有sizeof()都已转换为常量 另一方面,strlen()则从指定为参数的指针开始进入内存,直到找到0x00值(NULL)sizeof仅根据类型声明获取大小。它不关心内容,而是在编译时计算的 strlen()必须扫描数组以查找空字节,如您所说。这是O(n) 他们给出了不同

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

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

sizeof()
操作符完全由C编译器管理。编译完程序后,查看对象文件,查看所有
sizeof()
都已转换为常量


另一方面,
strlen()
则从指定为参数的指针开始进入内存,直到找到
0x00
值(
NULL

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)

您自己解释过:它必须扫描字符串以查找空值。这怎么可能是O(1)?
sizeof
只查看数组声明中的大小,它不关心其中包含的内容。因此,它不能类似地只查看字符串文本中的字符数吗?什么字符串文本?我说的是数组。是的,这有助于展示sizeof和strlen如何返回不同的值。您提到的编译时优化似乎总是可以应用的。当你有
chars[1000]=“abc”编译器在编译时可以在
“abc”
和calculate strlen中看到三个字符。这就是为什么我想知道为什么会是O(n)。第二个呢?变量不再包含它的初始值,它包含复制到其中的任何内容。是的,编译器可能会注意到数组在初始化后没有更改并优化调用。但这不是必须的,你不能指望它。