【问题标题】:Array not printing Properly in C++ [closed]数组未在 C++ 中正确打印 [关闭]
【发布时间】:2017-06-29 23:47:38
【问题描述】:

运行该程序时,如果n 的值设置为10,它将打印数组a 的索引以及从a[0]a[9] 的存储值。但是,如果我将 n 的值设置为超过 10,那么它只会打印数组 aa[0]a[5] 的索引及其存储的值。有人可以向我解释为什么会这样吗?

#include <iostream>
using namespace std;

int main()
{
    int a[10];
    int i, n=11;

    for(i=0; i<n; i++) {
        a[i]= 5;
    }

    cout<<"The array is: \n";   

    for(i=0; i<n; i++)
    {
        cout<<"a["<<i<<"] = "<<a[i]<<endl;
    }

    return 0;
}

【问题讨论】:

  • @PaulR 发布的代码是展示问题的完整示例。 . .在 OP 使用的任何编译器上。但是从代码中问题就很清楚了。
  • 因为您使用的是 C++14,所以请查看基于范围的 for 和 std::array。访问越界索引时,后者可能会在调试模式下提供额外的错误处理。
  • @PaulR 哦,我明白了,你在悬疑。即使问题表明当您将 n 从 10 更改为大于 10 的值时会出现问题,并且进行/读取的更改是微不足道的,但您希望发布的代码恰好是触发问题的版本。 . .给你:ideone.com/sqXos6
  • @PaulR 这个问题很清楚。代码在 n 10 时爆炸。我做了一个应该让你满意的编辑。编辑:知道你可能会挑剔,n = 0。
  • @iheanyi:感谢您帮助改进问题。我现在也刚刚清理了文本,以便其他人更容易理解。

标签: c++ arrays


【解决方案1】:

如果您将n 的值增加到超过数组的大小(或等于它从0 开始的索引),则您将超过数组的末尾。越过数组的末尾是未定义的行为。如果您的程序表现出未定义的行为。任何事情都有可能发生。 See this blog post from Microsoft for more on undefined behavior

如果您切换到 std::array 而不是 C 数组并使用 .at(),那么会发生一些明确定义的事情,您将收到 std::out_of_range 异常。更多信息见http://en.cppreference.com/w/cpp/container/array/athttp://en.cppreference.com/w/cpp/container/array

【讨论】:

  • @πάνταῥεῖ 你错了,使用 sizeof(a) 不会告诉你如果索引超出数组末尾会发生什么,这实际上是未定义的行为。
  • @iheanyi 我说您可以轻松地使用它来检查它是否有效访问特定索引。
  • 你们说的都是对的 :) 只是说的不一样!
  • @iheanyi 我不太在意。有一个cookie:你是对的未定义的行为是未定义的
  • @πάνταῥεῖ 谢谢,饼干很好吃?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 2021-10-04
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多