2017-05-23 58 views
0
int main(){  
     char s[1000];  
     s[0]='Q';  
     printf("%d",strlen(s));  
     return 0;  
    } 

上面的代码给出了6个输出。 在这种情况下,输出应为1。为什么这个片段给出6作为输出?

int main(){  
     char s[1000];  
     printf("%d",strlen(s));  
     return 0;  
} 

该代码甚至给出了6个输出。 它应该是1000或0或一些垃圾值。 我已经在“hackerrank”中试过了,但是它给出了6作为长度。 当在TURBOC中尝试相同的代码时,它给出了正确的答案。 我无法找到此输出的原因。有人可以把它整理出来,并给出这个问题的确切解决方案。

+0

您是否在字符串的末尾追加了'\ 0'? –

+0

你应该查阅strlen()的文档。男人strlen。 – ThingyWotsit

+4

'6'是一个垃圾值:) – ThingyWotsit

回答

4

本地非静态变量,比如你的数组,不会被初始化。其价值或内容将是不确定

这意味着您的数组中包含字符串终止符的位置的可能性接近于零。

将未经初始化的数组传递给字符串函数会导致未定义的行为

您需要显式初始化您的数组,例如

char s[1000] = ""; 
+1

您也可以使用'char s [1000] = {0};'用'\ 0''s填充它。 – InternetAussie

+1

@InternetAussie我的初始化等同于你的。 –

+1

哦,没错。哎呀。仍然是另一种选择:第 – InternetAussie

2

行:

char s[1000]; 

宣布的1000个字符数组,但它不把任何东西在里面。因为它是一个局部变量,所以它被分配在堆栈上,除了保留必要的空间来容纳1000 char之外,编译器不会生成任何代码来设置其内容(为零或其他)。

所有1000个值都是垃圾。它们恰好是它们的零点。 strlen()到达时停止计数并返回6,但此值也是垃圾。它可能是230790345或其他的东西。它也可能产生无限循环,分段错误或使你像龙一样喷射出火。在这种情况下,任何事情都是可能的并且被语言所允许。它被称为Undefined Behaviour

相关问题