在下面的例子中,当我定义未初始化的char数组并且想要查找长度时,它是未定义的行为。是否需要初始化char数组以获得精确的长度?
#include<stdio.h>
int main()
{
char a[250];
printf("length=%d\n",strlen(a));
}
我得到了“0”。我不知道如何?解释一下。
在下面的例子中,当我定义未初始化的char数组并且想要查找长度时,它是未定义的行为。是否需要初始化char数组以获得精确的长度?
#include<stdio.h>
int main()
{
char a[250];
printf("length=%d\n",strlen(a));
}
我得到了“0”。我不知道如何?解释一下。
好运。无论是好还是坏运气都是一个意见问题。数组的内容是已经占用该内存的任何内容,并且未被初始化。在你的情况下,它发生的第一个字节是'\0'
。
这当然是未定义的行为,你不能依靠这种方式发生。
当你定义
char a[250];
阵列将包含garabage内容和随机的。
strlen(a)
计算非空字符的编号('\0'
),直到它找到空字符,然后停止。
因此,如果您char a[250];
数组包含garabage元素,第一个元素是随机设置为null '\0'
的strlen(a)
将返回0
你在你的例子说,你正在使用的未初始化字符数组显示未定义行为,那么当你得到“0”你想要一个解释?这是......未定义的行为。
如果您的长度为0,则意味着您的未初始化的数组中只有0作为a[]
的第一个元素。当它是一个未初始化的地方,这意味着,只要C类标准的concerened,什么都可以在里面,包括0
为了解决您的标题的问题:“是否需要初始化字符阵列精确的长度?“
是的,为了能够通过strlen()
函数确定性地知道char数组中的字符串的长度,需要存在空终止符。这意味着它需要以某种方式进行初始化或设置。
至于其他的答案说的strlen()的结果是更多的运气比定义的行为问题
要找到内存块使用sizeof的“大小”(),而不是
注:我“VE还包括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));
}
它不一定运气;一些编译器可能会像全局一样初始化未设置的局部变量,但编译器不需要这样做(因此为什么它是未定义的行为),因此不应该依赖行为。 – JAB
@JAB:有趣的一点。虽然我没有碰到过这样的编译器,但我想不出任何会禁止编译器这样做的东西。 – FatalError
没关系,但有时当我增加数组的长度时,它有时会显示1或2或3。 char a [300]; 它显示结果= 3。 这是有相同的解释。 –