【问题标题】:Adding more elements than allocated space [duplicate]添加比分配空间更多的元素[重复]
【发布时间】:2016-01-17 14:33:02
【问题描述】:

在我的数据结构课上,老师给了我们一个简单的代码,用循环打印数组中的元素。我声明了一个包含 10 个元素的数组,但初始化了 15 个元素的值为 5,而不是打印 15 个元素,因为我知道其余元素将显示垃圾值。但它只输出 5 个元素。事实上,它显示了我将数组初始化为的元素数量。我正在使用代码块 13.12。 提前致谢。

#include <iostream>
using namespace std;

int main(){
    int i,n;
    int arr[10];
    n=15;

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

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

    return 0;
}

【问题讨论】:

  • 写入(或读取该遮罩)超出任何内容的范围会导致未定义的行为。不要这样做。
  • 如果你做愚蠢的事情你自己。
  • 哦,如果你不知道编译时数组的大小,那么使用std::vector,它允许你在运行时设置大小,当然还有追加新的运行时的元素。

标签: c++ arrays


【解决方案1】:

程序有未定义的行为,因为数组外的内存被覆盖了。

这就是为什么在您的系统中程序只输出 5 个元素的原因。初始化数组时,变量n 在以下循环中被值 5 覆盖。

//...
int arr[10];
n=15;

for(i=0;i<n;i++){
    arr[i] = 5;
}
//...

【讨论】:

    【解决方案2】:

    代码的行为未定义。通过推理它可能会做什么,几乎没有什么收获。只需修复数组大小。 (可能是越界写入之一覆盖了n 的值)。

    【讨论】:

      【解决方案3】:

      这种类型的代码会产生未定义的行为——也就是说,代码的行为没有被标准定义,因此编译器可以做任何他们想做的事情。不要这样做。其他未定义行为的示例包括

      • 除以零
      • 读/写NULL指针
      • 有符号整数溢出
      • 双免费
      • 等等……

      【讨论】:

        【解决方案4】:

        C++ 编译器不对数组大小进行绑定检查。有时它会提供所需的输出,有时它会崩溃。这将导致未定义的行为

        你绝对应该避免它。

        【讨论】:

          【解决方案5】:

          这是一个糟糕的编码,几乎没有努力或研究。这是你的作业,至少要花时间正确地完成它。

          这里有一些帮助,但不是全部:

          #include <iostream>
          using namespace std;
          
          int main(){
              int i,n;
              int arr[10];
              n=15;
              int x;
          
              for(i=0;i<n;i++){
              arr[i] = x
              cout << arr[i] << endl;
              }
          
          return 0;    
          }
          

          你必须做一些事情才能让它发挥作用。我不会的!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-02-19
            • 2023-01-18
            • 2020-08-08
            • 1970-01-01
            • 1970-01-01
            • 2021-12-09
            • 1970-01-01
            • 2011-12-24
            相关资源
            最近更新 更多