Cần giải thích về lỗi cấp phát động

#include<stdio.h>
#include<stdlib.h>
int scan_rows_column(int*,int*);
int array_allocation(int,int,int**);
int value_array(int,int,int**);
int sum_array(int,int,int**);

int main(int argc,char*argv){
    int**array=NULL;
    int n=0,m=0;
    scan_rows_column(&n,&m);
    array_allocation(n,m,array);
    value_array(n,m,array);
    printf("%d",sum_array(n,m,array));
    free(array);
    return 0;
}
int scan_rows_column(int*n,int*m){
    scanf("%d",n);
    scanf("%d",m);
}
int array_allocation(int n,int m,int**array){
    array= (int**)malloc(n*sizeof(int*));
    for(int i=0 ; i<n ; i++)
        array[i] = (int*)malloc(m*sizeof(int));
}
int value_array(int n,int m,int**array){
    for(int i=0 ; i<n ; i++){
        for(int j=0 ; j<m ; j++){
            scanf("%d",&array[i][j]);
    }}
}
int sum_array(int n,int m,int**array){
    int sum=0;
    for(int i=0 ; i<n ; i++){
        for (int j=0 ; j<m ; j++){
            sum += array[i][j];
        }
    }
    return sum;
}

Chương trình bị lỗi ở function array_allocation, mình đã thử chuyển nó qua main thì lại chạy được, có ai giải thích lỗi này với ạ.

phải truyền tham chiếu cho array mới thay đổi giá trị của nó array = ... được. Giống như void triple(int n) mà gán n = 3*n; thì chả có tác dụng gì với n hết, phải truyền tham chiếu n vào: void triple(int *n) rồi gán *n = 3 * *n; thì mới thay đổi giá trị của n truyền vào được.

4 Likes

Ý bác là array hiện đang không có giá trị địa chỉ nào cả , nên không truyền được phải k? Vậy có lẽ chỉ còn cách chuyển cấp phát động về main thôi.

em biết swap 2 giá trị trong C ko? Tương tự array 2 chiều ở đây cũng vậy. Thêm 1 dấu * vào :V :V

khai báo int array_allocation(int n,int m,int**array) thì khi gọi array_allocation(n,m,array); thì arraytruyền vào array_allocation là 1 biến copy của array trong main chứ ko phải biến array trong main. Muốn truyền array trong main thì phải truyền con trỏ của array vào: int array_allocation(int n,int m,int*** array) (3 dấu *) và gọi array_allocation(n,m, &array);, khi đó (*array) trong hàm allocation kia chính là array trong main.

em có gọi free(array) thì free cho đúng cách :V Phải free từng array[i] rồi mới free array :V

4 Likes

Cảm ơn a về free(array) thì quả thật do em ẩu tìm hiểu không kỹ.

int array_allocation(int n,int m,int***array){
    *array= (int**)malloc(n*sizeof(int*));
    for(int i=0 ; i<n ; i++)
        (*array)[i] = (int*)malloc(m*sizeof(int));
}

Em đã sửa theo ý kiến của a và đã chạy được.
Theo ý tưởng ban đầu của em thì array là địa chỉ đầu tiên của mảng array[i][j] nên e truyền địa chỉ qua function array_allocation.
Nhưng mà chỉ khi cấp phát địa chỉ thì e truyền như vậy được, còn không sẽ bị lỗi như trên.
E không rõ lắm vì sao lại lỗi nữa, chả lẽ trước khi cấp phát, array chỉ được coi là một biến?

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?