不要纠结于它被传递了一个地址。 strlen()
总是需要一个地址。它的参数是一个 const char *
,即字符串的地址。所有这些调用都传递了完全相同的地址:
strlen(baz);
strlen(&bar[0]);
strlen(bar);
baz
被赋值为&bar[0]
,因此第一和第二个是等价的。数组衰减为指向其第一个元素的指针(array == &array[0]
),所以第二和第三个是等价的。
我的意思是,我们如何找到一个地址的长度,它只是一个数字?
假设根据您的示例,bar == &bar[0] == baz == (char *) 0xb96eb740
。 strlen()
首先检查内存位置0xb96eb740是否包含\0
。如果没有,则它将检查0xb96eb741。然后是0xb96eb742。然后是0xb96eb743。它将继续按顺序检查每个位置,直到找到\0
。
我知道这是真的。但为什么strlen(baz)
返回0?
正如相关问题和答案所解释的那样,这种行为是不确定的,因为`bar[128]`数组的内容未初始化。该数组中可以包含任何内容,我们只知道一个单元格的值,即`bar[127]`,它设置为`\0`。所有其他单元都未初始化。
这意味着它们中的任何一个,或全部,或没有一个,都可能包含`\0`字符。它甚至可能在每次调用时运行到运行发生改变。每次调用`foo()`时,结果都可能不同。这完全有可能。结果将根据在调用`foo()`之前在堆栈上发生的数据而变化。
当我运行此代码时,每次给出的结果都是0,而正确的答案是0和127(我仍然不明白为什么?)。
它可以返回0和127之间的任何值。由于不确定的行为,您不应该过多地解读程序在运行时返回的内容。如果您再次运行程序,调用foo()
之前调用了不同的函数集,或者在运行之前运行了不同的程序,更改编译器,或者在一周的不同日期运行它,使用不同的操作系统等等,输出可能会有所不同。
strlen(baz)
返回 0? - daya0
。 - Gerhardh