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