【问题标题】:Why does this program print -58684322800B5FD80?为什么这个程序打印 -58684322800B5FD80?
【发布时间】:2026-02-08 05:30:01
【问题描述】:
#include "stdafx.h"
#include <iostream>
using namespace std;


int main()
{
        int x[3];
        int i;
        int pause;
        for (i = 0; x[i] < 10; i++); {
                x[i] *= x[i];
                cout << x[i];
        }
        cout << x;
        cin >> pause;

    return 0;
}

我做错了什么?

不应该打印吗:

16
25
36
{16, 25, 36}

我对 C++ 很陌生,所以我可能误用了循环。

谢谢

【问题讨论】:

  • 为什么要打印那个?你从未初始化过你的数组。
  • 你超出了数组的大小。调用未定义的行为时,您期望什么?
  • 未初始化的局部变量,包括数组,是未初始化的!它们的值将是indeterminate并且在C++中甚至读取那些值导致undefined behavior
  • 你似乎对C++有不少误解。你应该退后一步,从一本好书中系统地学习语言。
  • @Someprogrammerdude - 字符数组除外

标签: c++


【解决方案1】:

您需要初始化数组内容。编译器不会为您执行此操作。

即使这样,您也需要将它们初始化为非零值,否则循环将永远不会终止。

您的算法也容易受到您在数组边界之外的写入的影响。你确定我永远不会大于2吗?我不是。

最后,由于指针衰减,您的 cout 调用将输出 x 的第一个元素的地址。要输出实际元素,请使用 x[i] 或类似的。

【讨论】:

    【解决方案2】:

    读取/写入未初始化的变量将产生未定义的行为。

    在您的情况下,您应该在使用之前初始化数组。

    int x[3] = {4, 5, 6};
    

    这也不是如何遍历数组元素:

     for (i = 0; x[i] < 10; i++);{}
    

    上面你应该检查i是否小于数组的大小(3)而不是值10。

    同时删除分号;,因为在您的代码中不会发生迭代,for loop 下面的主体将被执行一次。

    所以您的代码将如下所示:

        int x[3] = {4, 5, 6};
    
        for (int i = 0; i < 3; i++) {
            x[i] *= x[i];
            std::cout << x[i];
        }
    
       std::cin.get();
    
    • 正如我在上面猜想的那样,根据您想要的输出以及循环的用途,我用值填充了数组:4, 5, 6;

    • 你也不应该这样打印数组的元素:

      std::cout

    上面只会打印第一个元素x[0]的地址,因为数组的名称将衰减为指向其第一个元素(元素0)的指针。

    std::cout << *x; // will print 16 (4 * 4). Which is the first element.
    

    要打印或分配所有元素,请使用迭代:

    for(int i(0); i < 3; i++)
        std::cout << x[i] << ", ";
    

    【讨论】:

      【解决方案3】:

      你必须初始化你的数组。 不为局部变量执行默认初始化。 这就是它打印垃圾值的原因。

      【讨论】: