Oke, jadi saya perlu mengalokasikan matriks secara dinamis di C dan kemudian meneruskannya untuk dimodifikasi dalam suatu fungsi (saya ingin perubahan yang saya buat di dalam fungsi tetap ada setelah saya kembali ke main). Inilah yang saya lakukan:

void read_zone (int *(**m), int N, int M) {
    int x, i, j;
    for (i = 0; i < N; i++) {
        for (j = 0; j < M; j++) {
            scanf("%d", &x);
            m[i][j] = x;
        }
    }

Dan kemudian di dalam main() saya punya:

int **m;
int N = 2, M = 3;

m = (int **) malloc(N * sizeof(int *));

for (i = 0; i < N; i++) {
    m[i] = (int *) malloc(M * sizeof(int));
}
read_zone(&m, N, M);

Jadi masalahnya adalah ketika memasuki fungsi tampaknya m[0][2] tidak dialokasikan (walaupun m[0][0] dan m[0][1] adalah), tetapi di main saya dapat mengakses itu, jadi itu pasti disebabkan oleh cara saya meneruskannya ke fungsi (&m). Apa cara yang tepat untuk melakukannya?

1
Gilzean 30 Desember 2017, 23:22

1 menjawab

Jawaban Terbaik

Anda harus melakukan dereferensi terlebih dahulu seperti ini karena kemudian Anda mendapatkan penunjuk ganda yang telah Anda alokasikan memorinya secara dinamis

(*m)[i][j] = x;

Juga jangan berikan nilai kembalian malloc.

Bahkan melewati alamat m di sini adalah berlebihan di tempat pertama. Anda cukup melakukan ini

read_zone(m, N, M);

Dan

void read_zone (int **m, int N, int M) {
   ..
       scanf("%d", &x);
       m[i][j] = x;
   ..
}

Masalahnya di sini melewati alamat variabel tidak akan melayani Anda tujuan apa pun. Anda tidak mengubah nilai penunjuk ganda.

Jika Anda telah mengkompilasi kode Anda - Anda akan melihat bahwa kompiler mengeluhkan ketidakcocokan tipe. Tanda tangan fungsi adalah

void read_zone (int ***m, int N, int M) (The way you did)

Periksa nilai pengembalian malloc , scanf untuk mengetahui apakah panggilan ke mereka berhasil atau tidak.

Bebaskan memori yang dialokasikan secara dinamis saat Anda selesai bekerja dengannya.

Kompilasi kode dengan semua flag diaktifkan gcc -Wall -Werror progname.c.(Menggunakan gcc).

2
user2736738 30 Desember 2017, 20:32