2013-06-11 51 views

回答

6

好运。无论是好还是坏运气都是一个意见问题。数组的内容是已经占用该内存的任何内容,并且未被初始化。在你的情况下,它发生的第一个字节是'\0'

这当然是未定义的行为,你不能依靠这种方式发生。

+0

它不一定运气;一些编译器可能会像全局一样初始化未设置的局部变量,但编译器不需要这样做(因此为什么它是未定义的行为),因此不应该依赖行为。 – JAB

+0

@JAB:有趣的一点。虽然我没有碰到过这样的编译器,但我想不出任何会禁止编译器这样做的东西。 – FatalError

+0

没关系,但有时当我增加数组的长度时,它有时会显示1或2或3。 char a [300]; 它显示结果= 3。 这是有相同的解释。 –

2

当你定义

char a[250]; 

阵列将包含garabage内容和随机的。

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

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

4

你在你的例子说,你正在使用的未初始化字符数组显示未定义行为,那么当你得到“0”你想要一个解释?这是......未定义的行为。

如果您的长度为0,则意味着您的未初始化的数组中只有0作为a[]的第一个元素。当它是一个未初始化的地方,这意味着,只要C类标准的concerened,什么都可以在里面,包括0


为了解决您的标题的问题:“是否需要初始化字符阵列精确的长度?“

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

3

至于其他的答案说的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)); 
} 
相关问题