【问题标题】:Segmentation Fault in dynamically array creation动态数组创建中的分段错误
【发布时间】:2021-10-21 22:27:43
【问题描述】:

我正在制作一个 cpp 程序,它从用户那里获取两个输入,确定二维数组的大小并将值传递给 mat 类构造函数并动态创建用户的数组定义的大小。但是,我不知道为什么它不起作用并显示 segmentation fault

#include<iostream>
using namespace std;

class mat{
    int **a;
    int r, c;
    public:
        mat(int row, int col){
            r = row;
            c = col;
            
            for(int i = 0; i < r; i++){
                *a = new int[r];
                *a++;
            }
            
        }
        void input(){
            for(int i = 0; i < r; i++){
                for(int j = 0; i < c; j++){
                    cin >> a[i][j];
                }
            }
        }
        void display(){
            for(int i = 0; i < r; i++){
                for(int j = 0; i < c; j++){
                    cout << a[i][j] << "\t";
                }
                cout << endl;
            }
        }
    
};

int main()
{
    int r, c;
    cout << "enter row :";
    cin >> r;
    cout << "enter column :";
    cin >> c;
    mat m(r, c);
    m.input();
    cout << "array \n";
    m.display();
}

我感觉问题出在构造函数中的 for 循环上,或者我做错了。

【问题讨论】:

  • 你需要初始化a。
  • 由于 a、r 和 c 是私有的,您可以使用平面 vector&lt;int&gt; a 并使用 r * c 计算其一维大小。然后在从 2D 坐标访问 1D 矢量时将 2D x,y 转换为 x + y * c。
  • 您分配内存只是为了保存大小为 r 的指针数组,但您从未分配任何内存来保存这些指针指向的实际数据。
  • 这能回答你的问题吗? stackoverflow.com/questions/936687/…
  • 当你做*a = new int[r];时,你认为a在指向什么? (一旦你解决了这个问题,你认为循环结束时它指向什么?)

标签: c++


【解决方案1】:

该类包含多个错误。

  • 变量a 从未初始化。当我们尝试寻址a 指向的内存时,我们会遇到分段错误。我们可以像这样初始化它a = new int*[r]
  • 我们不应该改变a指向的位置,所以不要使用a++。否则a[i][j] 不会引用第 i 行和第 j 列。我们还想在某个时候释放内存。
  • 一旦进入列for(int j = 0; i &lt; c; j++) 的内部循环将永远不会终止,最终会产生分段错误。我们需要将i &lt; c 更改为j &lt; c。

如果我们修复这些错误,它看起来像这样:

class mat {
    int** a;
    int r, c;
public:
    mat(int row, int col) {
        r = row;
        c = col;

        a = new int*[r];
        for (int i = 0; i < r; i++) {
            a[i] = new int[c];
        }
    }
    void input() {
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                cin >> a[i][j];
            }
        }
    }
    void display() {
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                cout << a[i][j] << "\t";
            }
            cout << endl;
        }
    }
};

【讨论】:

  • 实际上我在 geeksforgeeks 的帮助下发布问题后解决了所有这些问题,仍然非常感谢您的回答。
猜你喜欢
  • 2021-05-19
  • 2021-08-19
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多