在下面的示例中,当我定义未初始化的 char 数组并想要查找长度时,这是未定义的行为。
#include<stdio.h>
int main()
{
char a[250];
printf("length=%d\n",strlen(a));
}
我得到“0”。我不知道怎么办?解释一下。
运气。是好是坏是见仁见智的问题。您的数组的内容是已经占用该内存的任何内容,并且未初始化。在您的情况下,第一个字节是 a '\0'
。
当然,这是未定义的行为,您不能依赖它以这种方式发生。
您在示例中说过您使用未初始化的 char 数组来显示未定义的行为,那么当您得到“0”时,您需要解释吗?这是......未定义的行为。
如果长度为 0,则意味着恰好有一个 0 作为a[]
未初始化数组中的第一个元素。当它是一个未初始化的本地时,这意味着就 C 标准而言,任何东西都可以在那里,包括 0。
要解决标题中的问题:“是否有必要初始化 char 数组以获得准确的长度?”
是的,为了能够通过该strlen()
函数确定性地知道 char 数组中字符串的长度,需要存在空终止符。这意味着它需要以某种方式初始化或设置。
正如其他答案所说, strlen() 结果更多的是运气而不是定义的行为
要查找内存块的“大小”,请改用 sizeof()
注意:我string.h
还在printf
#include<stdio.h>
#include<string.h>
int main()
{
char a[250];
printf("length=%ld\n",strlen(a));
printf("sizeof=%ld\n",sizeof(a));
}
当你定义
char a[250];
该数组将包含垃圾内容和随机数。
strlen(a)
计算非空字符('\0'
)的数量,直到找到空字符然后停止。
因此,如果您的char a[250];
数组包含垃圾元素并且第一个元素随机设置为 null '\0'
,strlen(a)
则将返回 0