使用malloc()在函数中初始化二维数组

时间:2014-04-24 19:57:26

标签: c arrays function malloc 2d

我遇到了问题。 我需要编写一个函数,它将使用malloc()分配任何2D数组但是我迷失了并且不知道可能出错的地方。 这是我到目前为止写的:

void matrix_ini(int **arr, int SIZE_X, int SIZE_Y);

int main() {

        int **arr;
        matrix_ini(arr, 2, 3);

        return 0;
}

void matrix_ini(int **arr, int SIZE_X, int SIZE_Y) {

        srand(time(NULL));

        arr = malloc(SIZE_X * sizeof *arr);

        for (int i = 0; i < SIZE_X; i++) {

                arr[i] = malloc(SIZE_Y * sizeof arr);
        }   

        //initializing array with some numbers:

        for (int i = 0; i < SIZE_X; i++) {

                for (int j = 0; j < SIZE_Y; j++) {

                        arr[i][j] = rand()%10;

                }   
        }   
}

我究竟做错了什么? 请温柔,我刚开始学习。欢迎任何提示。

1 个答案:

答案 0 :(得分:1)

问题#1:

此:

arr = malloc(SIZE_X * sizeof(*arr));

等同于:

arr = malloc(SIZE_X * sizeof(int*));

哪个适合你的目的。

但是这个:

arr[i] = malloc(SIZE_Y * sizeof(arr));

等同于:

arr[i] = malloc(SIZE_Y * sizeof(int**));

哪个可以用于您的目的。

所以改成它:

arr[i] = malloc(SIZE_Y * sizeof(int));

问题#2:

如果您希望某个函数更改您调用它的变量的值,则必须使用该变量的地址来调用它。否则,它可以仅在本地(即在函数范围内)更改该变量的值。这几乎迫使您改变函数matrix_init的整个原型,实现和使用:

void matrix_init(int*** arr, int SIZE_X, int SIZE_Y)
{
    int** temp_arr;

    temp_arr = malloc(SIZE_X * sizeof(int*));
    for (int i = 0; i < SIZE_X; i++)
    {
        temp_arr[i] = malloc(SIZE_Y * sizeof(int));
        for (int j = 0; j < SIZE_Y; j++)
        {
            temp_arr[i][j] = rand()%10;
        }
    }

    *arr = temp_arr;
}

然后,在函数main中,您应该调用matrix_init(&arr,2,3)

问题#3:

您应确保释放在运行时期间动态分配的任何内存块,稍后执行程序。例如:

void matrix_free(int** arr, int SIZE_X)
{
    for (int i = 0; i < SIZE_X; i++)
    {
        free(arr[i]);
    }
    free(arr);
}

然后,在函数main中,您应该调用matrix_free(arr,2)