0

在下面的示例中,当我定义未初始化的 char 数组并想要查找长度时,这是未定义的行为。

#include<stdio.h>
 int main()
{
char a[250];
printf("length=%d\n",strlen(a));
}

我得到“0”。我不知道怎么办?解释一下。

4

4 回答 4

6

运气。是好是坏是见仁见智的问题。您的数组的内容是已经占用该内存的任何内容,并且未初始化。在您的情况下,第一个字节是 a '\0'

当然,这是未定义的行为,您不能依赖它以这种方式发生。

于 2013-06-11T16:03:24.997 回答
4

您在示例中说过您使用未初始化的 char 数组来显示未定义的行为,那么当您得到“0”时,您需要解释吗?这是......未定义的行为。

如果长度为 0,则意味着恰好有一个 0 作为a[]未初始化数组中的第一个元素。当它是一个未初始化的本地时,这意味着就 C 标准而言,任何东西都可以在那里,包括 0。


要解决标题中的问题:“是否有必要初始化 char 数组以获得准确的长度?”

是的,为了能够通过该strlen()函数确定性地知道 char 数组中字符串的长度,需要存在空终止符。这意味着它需要以某种方式初始化或设置。

于 2013-06-11T16:05:36.517 回答
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));
 }
于 2013-06-11T16:09:04.780 回答
2

当你定义

char a[250];

该数组将包含垃圾内容和随机数。

strlen(a)计算非空字符('\0')的数量,直到找到空字符然后停止。

因此,如果您的char a[250];数组包含垃圾元素并且第一个元素随机设置为 null '\0'strlen(a)则将返回 0

于 2013-06-11T16:04:45.810 回答