#include <stdio.h>
void main()
{
char a[8];
a[0] = 'h';
a[1]='e';
a[2]='l';
/*a[3]='l';
a[4]='o';*/
printf("%s", a);
}
当我运行此程序时,它打印出:hel
但是为什么当我这样的时候呢?
#include <stdio.h>
void main()
{
char a[8];
a[0] = 'h';
a[1]='e';
a[2]='l';
a[3]='l';
a[4]='o';
printf("%s", a);
}
打印出来:hello
如果字符串是3个字符或更少,那么它会正确地打印出字符串,但是如果我有更多而且最后没有NULL字符(表示字符串的结尾),它会打印出一些垃圾?
此外,这是在C.
答案 0 :(得分:2)
您正面临一些意外行为,因为您没有使用NUL
'\0'
字符关闭字符串。在第一个版本中,当您跳过数组中的[3]
地址时,它可能包含一个致命关闭字符串的0
,但这绝对是随机且不可预测的。
答案 1 :(得分:0)
在C中,动态(malloc
...)和自动(堆栈)变量不是零初始化。只有静态和线程局部变量归零
因此,如果您没有自己提供终止0,则可能没有,因此您的字符串不会被终止并使用它会导致未定义的行为。
无论如何,在某些情况下,使用不确定的值会导致实现定义或未定义的行为本身,这可能会使您的程序行为不正常。