打印字符串不一致 #包括 void main() { chara[8]; a[0]=“h”; a[1]=“e”; a[2]=“l”; /*a[3]='l'; a[4]='o'*/ printf(“%s”,a); }

打印字符串不一致 #包括 void main() { chara[8]; a[0]=“h”; a[1]=“e”; a[2]=“l”; /*a[3]='l'; a[4]='o'*/ printf(“%s”,a); },c,string,initialization,stack,printf,C,String,Initialization,Stack,Printf,当我运行这个程序时,它会打印出来: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); } #包括 void main() { chara[8]; a[0]=“h”; a[1]=“e”; a[2]=“l”; a[3]='l'; a[4

当我运行这个程序时,它会打印出来: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); 
}
#包括
void main()
{
chara[8];
a[0]=“h”;
a[1]=“e”;
a[2]=“l”;
a[3]='l';
a[4]='o';
printf(“%s”,a);
}
它打印出来:你好��

如果字符串是3个字符或更少,那么它会正确地打印出字符串,但是如果我有超过3个字符,并且末尾没有空字符(表示字符串的结尾),它会打印出一些垃圾


此外,这在C中也是如此。

由于没有使用
NUL
'\0'
字符关闭字符串,因此您将面临一些意外行为。在第一个版本中,当您跳过数组中的
[3]
地址时,它可能包含致命地关闭字符串的
0
,但这是绝对随机和不可预测的。

在C中,动态(
malloc
..)和自动(堆栈)变量不是零初始化的。只有静态和线程局部变量为零。
因此,如果您自己不提供终止0,则可能没有终止0,因此您的字符串不会终止,并且使用它会导致未定义的行为


无论如何,在某些情况下,使用不确定值可能会导致实现定义或未定义的行为,这可能会使程序行为不稳定。

没有元素的字符数组“\0”不是字符串。如果在需要字符串的地方使用这样的数组,则会调用未定义的行为。
#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); 
}