我遇到了问题。 我需要编写一个函数,它将使用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;
}
}
}
我究竟做错了什么? 请温柔,我刚开始学习。欢迎任何提示。
答案 0 :(得分: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));
如果您希望某个函数更改您调用它的变量的值,则必须使用该变量的地址来调用它。否则,它可以仅在本地(即在函数范围内)更改该变量的值。这几乎迫使您改变函数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)
。
您应确保释放在运行时期间动态分配的任何内存块,稍后执行程序。例如:
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)
。