打印字符串不一致

时间:2014-04-13 18:14:31

标签: c string initialization stack printf

#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.

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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