01/10/2018, 09:09

Phát động mảng 2 chiều

Mình đang vọc về con trỏ, có thử cấp phát động mảng 2 chiều thì sai ở hàm X. Tại sao nó lại sai vậy mọi người ?

#include <iostream>
#include <cstdlib>
using namespace std;
//========prototype================
void X(int **arr, int row);
void initArr2d(int **arr,int row,int col);
void deleteArr2d(int **arr,int row,int col);

//==============================================
int main() {
    int **arr = NULL;
    int row = 3;
    X(arr, row);
    cout << "XXXXXX" << endl;
    initArr2d(arr, row, row);
    cout << "XXXXXX" << endl;
    deleteArr2d(arr, row, row);
    cout << "XXXXXX" << endl;
}
// ===============function======================
void X(int **arr, int row) {
    if ( (arr = new int*[row]) == 0) {
        cout << "No suficient memory.";
        exit(1);
    }
}
void initArr2d(int **arr,int row,int col) {
    for (int i = 0 ; i < row ; i++)
    {
        if ( (arr[i] = new int[col]) == 0 )
        {
            cout << "No sufficient memory.";
            exit(1);
        }

    }
}

void deleteArr2d(int **arr,int row,int col) {
    for (int i = 0 ; i < row ; i++)
        delete [] arr[i];
    delete [] arr;
}
Newbie viết 11:21 ngày 01/10/2018

Lỗi ở hàm initArr2d chứ, mình thử cho hàm X vào main thì chạy được, nhưng thành hàm thì lại lỗi.

Trần Hoàn viết 11:22 ngày 01/10/2018

Hình như cái này liên quan gì đó đến “tham biến” và “tham trị” thì phải.
Hàm mà muốn làm thay đổi biến đầu vào thì phải có “&”, kiểu như void initArr2d(&int **arr, int row, int col), lúc gọi hàm thì initArr2d(&arr, row, row);.

rogp10 viết 11:15 ngày 01/10/2018

Prototype phải ghi int& chứ.

Trần Hoàn viết 11:16 ngày 01/10/2018

ahjhj, mình không biết cái này, chỉ biết void initArr2d(int[][] ref arr, int row, int col) thôi :))
Thảo nào lúc phải dùng C++ để viết cái chương trình mô phỏng chết tiệt, mình viết mãi cái hàm không được, thằng bạn sửa cho mà chả biết nó sửa chỗ nào

rogp10 viết 11:23 ngày 01/10/2018

Tham chiếu là một trong những first-class object của C++ đấy

Lam Nguyen viết 11:22 ngày 01/10/2018

Bác ơi em cũng đang học đến con trỏ, cho em hỏi cái dòng if ( (arr = new int*[row]) == 0) có ý nghĩa gì vậy bác, em đọc mà không hiểu :((

rogp10 viết 11:25 ngày 01/10/2018

Phải thêm nothrow nữa mới đúng.

Newbie viết 11:14 ngày 01/10/2018

là kiểm tra xem phát động thành công hay không đó

Bài liên quan
0