我遇到了一个问题。我需要写一个函数,用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:
此:
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)
。