【问题标题】:Random Symbols Getting Printed Without Initialization未经初始化就打印随机符号
【发布时间】:2016-06-05 18:05:01
【问题描述】:

我做了一个相当短的基于文本的动画程序:

#include <iostream>

void animation(char words[], int sizeOfWords) {
    for(int x = 0; x < sizeOfWords; x++){
         for(double y = 0; y < 10000000; y++);
         std::cout << words[x];
         if(words[x] == '!') std::cout << std::endl;
    }
}

int main() { 
    char words[] = {'H','e','l','l','o',' ','W','o','r','l','d','!','T','h','i','s',' ','i','s',' ','m','y',' ','f','i','r','s','t',' ','C','+','+',' ','a','n','i','m','a','t','i','o','n','!','H','o','p','e',' ','y','o','u',' ','e','n','j','o','y','e','d','!'};

    int amountOfLetters = 0;
    for(unsigned x : words) amountOfLetters++;

    animation(words, amountOfLetters);
}

当我第一次制作程序时,我忘记将 int amountOfLetters; 初始化为 0。那时我得到了所有这些随机符号。无论是否初始化,程序都很好。只是不给它分配 0,我最终得到了这些额外的东西。

不初始化变量将给出以下结果:

世界你好! 这是我的第一个 C++ 动画! 希望你喜欢! ! t ht ÉH P j    T j Ðou2ö¤.■   Á╬ouÈ╬ouht mzou 进程返回 0 (0x0) 执行时间:11.466 s 按任意键继续。

初始化变量将给出以下结果:

世界你好! 这是我的第一个 C++ 动画! 希望你喜欢! 进程返回 0 (0x0) 执行时间:4.444 s 按任意键继续。

如果需要,您可以尝试自己运行代码。我只想知道为什么这些符号被打印出来。如果您能提供帮助,我将不胜感激。如果不是,感谢您的光临。

这篇文章不是为什么未初始化的字符数组会被随机符号填充?的重复。我谈论传递数组中的元素数量并将它们作为参数传递,然后循环它们。另一篇文章只是简单地谈论初始化一个数组 without Information in it 并打印它。同时,我又在谈论拥有信息,只是容纳它们的数组的大小是问题所在。简单地说,他们是关于打印一个没有元素的数组,我的是关于循环遍历一个有元素的数组,但是错误地对大小做出了错误。

【问题讨论】:

标签: c++ c++11 symbols


【解决方案1】:

您的 animation 函数正在按索引访问 char 数组,直到索引 == sizeOfWords。如果amountOfLetters 未初始化,您将开始增加一个随机值,因此将读取animation 中数组的末尾。当然,这具有随机值。

【讨论】:

  • 感谢您的回复。下次我会考虑到这一点。虽然我怀疑我会做 sizeOfWords 考虑我可以轻松地做到像另一条评论说sizeOf(words)
  • @J.Purcell 小心使用你的新武器sizeof(words) 实际上不会在 animation() 函数内部工作。
  • 嗯,我注意到了。在开始处理我的代码的小问题时,我尝试做类似于variable x = sizeof(words) 的事情,但没有成功。想通为什么,现在我知道了。谢谢。
  • 如上所述,words 衰减为函数内部的指针(在大多数情况下),sizeof(words) 将不起作用。我建议您使用 std 容器 - std::vector 最有可能。
【解决方案2】:

当我第一次制作程序时,我忘记初始化 int amountOfLetters;到 0。那是我得到所有这些随机符号的时候。无论是否初始化,程序都很好。只是不给它分配 0,我最终得到了这些额外的东西。

这是因为在不初始化 amountOfLetters 的情况下,amountOfLetters++; 操作是未定义的行为。

amountOfLetters 在循环开始时可能有一个任意值,因为它在之前的操作中留在堆栈中。


还请注意,您可以大大简化和改进您的代码,只需省略循环并编写:

 animation(words, sizeof(words));

【讨论】:

  • 感谢animation(words, sizeof(words));,它真的很有帮助。此外,意识到amountOfLetters 可以从任何随机数开始,并从那里递增有助于我理解我的错误。就像for(int x = 0; x &lt; **some number passed the last index of the array words**; x++){...}
猜你喜欢
  • 2016-02-28
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多