【问题标题】:Array loop outputting garbge after the loop ends循环结束后数组循环输出垃圾
【发布时间】:2013-11-16 20:02:08
【问题描述】:

我正在学习在 C++ 中使用数组。这是我为练习这些概念而编写的一个非常简单的程序。但是,当我启动程序时,命令提示符在输出 1 2 3 4 后输出垃圾。

当我将循环中数组的大小更改为 2 时,它可以工作。当我将其更改为零时,它仍然输出两个值。这是怎么回事?为什么数组表达式为2时输出4个值?只有2个值时,不应该只输出3个值吗?

#include <iostream>
#include <conio.h>

int main()
{
    int array[4] = { 1, 2, 3, 4 };

    for (unsigned int i = 0; i <= array[3]; i++)
    {
        std::cout << array[i] << "\n" << std::flush;
    }


    _getch();
    return 0;
}

【问题讨论】:

  • 把这个:i &lt;= array[3],改成这个:i &lt; sizeof(array)/sizeof(*array),不要习惯这种习惯,因为这个逻辑会随着动态分配的数组而消失。
  • @WhozCraig:那有什么作用?
  • 由于没有更好的术语,它会为您计算“4”。更深入地说,它通过整数除法计算元素的数量,其中整个数组的大小(以字节为单位)除以单个数组元素的大小(以字节为单位)。结果是数组中的元素数(在您的情况下为 4)。但正如我所说,它只适用于固定数组。指针引用的动态数组是一个完全不同的问题。

标签: c++ arrays loops


【解决方案1】:

array[3] = 4 所以当i == array[3] == 4 您尝试访问未定义的array[4] 时。你真的应该使用i &lt; array[3] 或(更好)i &lt; 4,因为如果你有

int array[4] = { 0, 2, 5, 100 }

然后使用 array[3] 将是 100,您将尝试循环 100 次。

【讨论】:

  • 嗯。这很有意义。有没有办法用数组的长度写条件语句?
  • @BrandonHoutzer 你可以像@WhozCraig 所说的那样做。这决定了数组的长度。如果您使用的是 C++,请查看 std::vector 及其 size() 函数
【解决方案2】:

您正在进行 5 次迭代,因为 array[3] = 4,然后当您打印 array[i] 时,您正在尝试打印未定义的 array[4]。现在试试这个:

for (unsigned int i = 0; i <= 3; i++)
{
    std::cout << array[i] << "\n" << std::flush;
}

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 2019-03-19
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多