#include<iostream>
#include<string.h>
using namespace std;
int main() {
char b[] = {'a','b',' ','c'};
cout << sizeof(b) << endl;
cout << strlen(b) << endl;
return 0;
}
为什么上面的输出是4,6不是4,4是正确的答案吗?
代码的行为是未定义的:strlen
要求b
必须在数组的边界内包含一个NUL
字符。
(请注意,' '
是一个空格,而不是NUL
。空格的处理方式与任何其他非NUL
字符strlen
没有区别。
如果你写过
char b[5]={'a','b',' ','c'};
那么C++会将 b
的最后一个元素设置为 0(即 NUL
(为你。
如果 strlen 在字符数组之间设置一个空格,它会怎么做?
虽然所有其他答案(根据您的代码示例,合法地!!(暗示由于数组中缺少空字符而导致的未定义行为,但我将回答您的原始问题:
没什么特别的,它会像任何其他字符一样计算空格(特别是,它不会像您假设的那样停止处理字符串(......
您的代码表现出未定义的行为:
如果传递给strlen
的参数未NUL
终止,则不会定义的行为。
您似乎将 NUL 字符与空格字符混淆了。
>strlen
遍历数组,直到遇到NULL
字符。数组不包含NULL
字符 (ASCII 0(,但包含一个空格 (ASCII 32(。
因此,strlen
继续通过您的阵列。它恰好在位置 6(内存中数组末尾后面的两个字符(存在一个NULL
字符,因此字符串长度为 6。此函数的后续执行可能会返回不同的值,因为数组外部的内存内容未定义。它也可能会崩溃。