我遇到了问题。 我需要编写一个函数,它将使用 malloc() 分配任何二维数组,但我迷失了,不知道可能出了什么问题。 这是我到目前为止所写的内容:
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
的整个原型(prototype)、实现和使用:
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)
。
关于c - 使用 malloc() 在函数中初始化二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23278590/