【问题标题】:Printing a string inconsistency打印字符串不一致
【发布时间】:2014-05-27 14:35:49
【问题描述】:
#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); 
}

打印出来:你好……

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

另外,这是在 C 中。

【问题讨论】:

  • 没有元素为'\0' 的字符数组不是字符串。如果您在需要字符串的地方使用这样的数组,则会调用 Undefined Behaviour。

标签: c string initialization stack printf


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      相关资源
      最近更新 更多