Почему моя функция доступа Matrix работает с ошибками? - PullRequest
0 голосов
/ 28 марта 2020

Я не понимаю, почему моя функция-член ij не может получить доступ к ячейкам памяти, созданным в массиве 2D-указателей rp, который я использовал в своем конструкторе. Любая помощь очень ценится. Спасибо.

Вот мой код и его вывод:


using namespace std;
#include <iostream>
class Mymatrix
{
    int numRows, numCols;
    int **rp;
public:
    Mymatrix(int r, int c)
    {
        numRows = r;
        numCols = c;
        int *rp[numRows];
        int i, j;
        for (i = 0; i < numRows; i++)
            rp[i] = new int[numCols];
        for (i = 0; i < numRows; i++)
        {
            cout << endl;
            for (j = 0; j < numCols; j++)
            {
                *(rp[i] + j) = i + j + 2;
                cout << rp[i] + j << "\t";
                std::cout << *(rp[i] + j) << "\n";
            }
        }
        std::cout << std::endl;
    }
    //Now, define member function to access the element in row-i, column-j.
    int ij(int i, int j)
    {
        cout << *(rp[i] + j) << endl;
        return *(rp[i] + j);
    }
};
///////////////

int main()
{
    Mymatrix M1(5, 7);
    M1.ij(2, 3);
    return 0;
}

//////////////////////////////////////// Вот код выхода /////////////////////

0x2010c20       2
0x2010c24       3
0x2010c28       4
0x2010c2c       5
0x2010c30       6
0x2010c34       7
0x2010c38       8</p>

<p>0x2010c50       3
0x2010c54       4
0x2010c58       5
0x2010c5c       6
0x2010c60       7
0x2010c64       8
0x2010c68       9</p>

<p>0x2010c80       4
0x2010c84       5
0x2010c88       6
0x2010c8c       7
0x2010c90       8
0x2010c94       9
0x2010c98       10</p>

<p>0x2010cb0       5
0x2010cb4       6
0x2010cb8       7
0x2010cbc       8
0x2010cc0       9
0x2010cc4       10
0x2010cc8       11</p>

<p>0x2010ce0       6
0x2010ce4       7
0x2010ce8       8
0x2010cec       9
0x2010cf0       10
0x2010cf4       11
0x2010cf8       12</p>

<p>Segmentation fault

1 Ответ

1 голос
/ 28 марта 2020

Вы никогда не инициализировали члена класса int **rp в своем коде.

int *rp[numRows]; Это недопустимый синтаксис C ++. Если повезет, компилятор создаст автоматический c объект, который будет недоступен после завершения выполнения конструктора.

rp = new int*[numRows]; Вместо этого он выделит хранилище для члена класса вместо создания объекта, локального для конструктор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...