【问题标题】:Why don't the unitialized indices of a char array print?为什么不打印 char 数组的未初始化索引?
【发布时间】:2014-05-14 17:07:15
【问题描述】:

为什么char 数组的其余部分没有打印出来?给定以下代码:

char charArray[10];     
charArray[0] = 'a';
charArray[1] = 'b';
charArray[2] = 'c';
charArray[3] = 'd';

string str1 = charArray + string("string") ;
cout << str1;

输出:abcdstring

虽然这个:

char charArray[10];     
charArray[0] = 'a';
charArray[1] = 'b';
charArray[2] = 'c';

string str1 = charArray + string("string") ;
cout << str1;

输出:abcstring

我知道其余数组索引中的值是未初始化的,但仍有值。所以我期待随机字符出现在那里,但是我没有看到任何表示未初始化值的奇怪字符。

那么,为什么 char 数组的其余部分没有被打印出来? (欢迎对更多核心内容进行更深入的回答,并且非常感谢我正在寻找将我的 C++ 知识扩展到专家的水平。)

【问题讨论】:

  • 因为未定义的行为?该数组的元素最初可能为零(通过“随机运气”),这意味着它就像一个以 null 结尾的字符串“abc”或“abcd”。

标签: c++ arrays string char


【解决方案1】:

纯属运气。

当你在这个上下文中使用你的字符数组时

string str1 = charArray + string("string")

数组被解释为 C 风格的字符串。

C 风格的字符串以零字符值终止。在您的情况下,第一个未初始化的数组元素(即第一个实验中的 charArray[4])碰巧为零(假设这是一个本地数组)。 charArray[4] 中的意外零作为字符串的零终止符,因此您的 charArray 恰好代表有效的 C 字符串 "abcd"。这正是你所看到的。

同样的事情发生在第二个实验中。

【讨论】:

  • 当我们说零字符值时,这意味着与空值相同还是未初始化?如果是,程序如何知道该值未初始化?
  • 零表示 0,也就是说,就好像你做了charArray[4] = 0;
  • 如果charArray 是静态变量而不是局部变量,它会自动初始化为全零值。
  • 哦。该死的。谢谢。 :)
  • @brain56:没有办法将 C 中的未初始化对象与已初始化对象区分开来。 “未初始化的值”是碰巧不可预测的常规值。在您的情况下,不可预测的值恰好是0。一个正常的常规零,就像任何其他零一样。
猜你喜欢
  • 2016-02-28
  • 2023-04-01
  • 1970-01-01
  • 2017-03-27
  • 2020-11-09
  • 2017-05-11
  • 2020-07-20
  • 1970-01-01
  • 2014-11-07
相关资源
最近更新 更多