【问题标题】:Error (std::bad_array_new_length) in a 2d array textbook example (Absolute C++, Savitch)二维数组教科书示例(Absolute C++,Savitch)中的错误(std::bad_array_new_length)
【发布时间】:2021-04-02 14:12:29
【问题描述】:

这是一个来自 Walter Savitch 的 Absolute C++ 的教科书示例:

我尝试了不同的版本但出现错误,所以我尝试准确地输入代码:

#include <iostream>
using namespace std;
typedef int* IntArrayPtr;

int main()
{
    int d1, d2;
    cout << "Enter dimensions (row*col): \n";
    cin >> d1, d2;
    IntArrayPtr *m = new IntArrayPtr[d1]; //Get me a d1 sized array of pointers
    int i,j;
    for(i=0; i<d1; i++)
        m[i] = new int[d2]; //each element in the array should be an array of size d2
    //m is now a d1*d2 array

    cout << "Enter " << d1 << " rows of " << d2 << " integers:\n";
    for(i=0;i<d1;i++)
        for(j=0;j<d2;j++)
            cin >> m[i][j];
    
    cout << "Your arry:\n";
    for(i=0;i<d1;i++)
        {for(j=0;j<d2;j++)
            cout << m[i][j] << " ";
        cout << endl;
        }

    for (i = 0; i < d1; i++)
        delete m[i]; //delete each pointer
    delete[] m; //delete the master pointer

    return 0;
    

}

当我尝试运行文本中的示例时,我一输入尺寸就出错了。

谁能帮我找出问题所在?到目前为止,这本教科书中的示例没有出现其他错误。

【问题讨论】:

  • //m is now a d1*d2 array 不完全是。这是一个d1 的数组,指向d1 的d2ints 的数组。这种区别很重要,并且由于缓存友好性差,可能会对程序的性能产生重大影响..
  • 看着这个,我在学校能跟 Savitch 学语言真是个奇迹。
  • @sweenish 你推荐其他资源吗?
  • Savitch 将助您一臂之力。但是看看那个代码,它不会是最顺畅的。虽然没有绝对的最佳书籍,但有the list of good books。

标签: c++ pointers multidimensional-array compiler-errors dynamic-arrays


【解决方案1】:

你的错误很可能在这一行:cin &gt;&gt; d1, d2;

应该是cin &gt;&gt; d1 &gt;&gt; d2;

编译时设置了少量的警告标志,在我的例子中是-Wall -Wextra,会立即向您揭示这一点。

这是我收到的警告:

main.cpp:9:16: warning: expression result unused [-Wunused-value]
    cin >> d1, d2;
               ^~
1 warning generated.

通过使用the comma operator,是的,这是一件事,您正在丢弃您的一个输入,而不是创建您认为的大小的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-16
    • 2021-01-15
    • 1970-01-01
    • 2016-07-15
    • 2010-09-26
    • 2020-06-15
    • 1970-01-01
    • 2016-05-07
    相关资源
    最近更新 更多