1. 实现动态二维数组的内存分配
#include <stdio.h>
#include <stdlib.h>
// 分配动态二维数组内存
int** createDynamic2DArray(int rows, int cols) {
int** arr = (int**)malloc(rows * sizeof(int*));
if (arr == NULL) {
perror("malloc");
return NULL;
}
for (int i = 0; i < rows; i++) {
arr[i] = (int*)malloc(cols * sizeof(int));
if (arr[i] == NULL) {
for (int j = 0; j < i; j++) {
free(arr[j]);
}
free(arr);
perror("malloc");
return NULL;
}
}
return arr;
}
2. 实现元素赋值操作
// 对动态二维数组元素赋值
void setValue(int** arr, int row, int col, int value) {
arr[row][col] = value;
}
3. 实现元素取值操作
// 获取动态二维数组元素值
int getValue(int** arr, int row, int col) {
return arr[row][col];
}
4. 释放动态二维数组内存
// 释放动态二维数组内存
void freeDynamic2DArray(int** arr, int rows) {
for (int i = 0; i < rows; i++) {
free(arr[i]);
}
free(arr);
}
5. 动态二维数组与普通二维数组在内存管理上的主要区别
- 普通二维数组:内存是在编译时分配的,大小固定,一旦定义好,其行数和列数在程序运行期间不能改变。例如
int arr[3][4];
,其内存是连续分配的,占用一块固定大小的内存空间,生命周期与所在的作用域相关,作用域结束时自动释放内存,无需手动管理。
- 动态二维数组:内存是在运行时通过
malloc
等函数分配的,其行数和列数可以由用户在运行时输入决定。由于是手动分配内存,使用完毕后必须手动调用 free
函数释放内存,否则会造成内存泄漏。动态二维数组内存分配不连续,第一维是一个指针数组,每个指针指向第二维的数组内存空间。
示例主函数
int main() {
int rows, cols;
printf("请输入行数: ");
scanf("%d", &rows);
printf("请输入列数: ");
scanf("%d", &cols);
int** dynamicArray = createDynamic2DArray(rows, cols);
if (dynamicArray == NULL) {
return 1;
}
// 赋值操作示例
setValue(dynamicArray, 0, 0, 10);
setValue(dynamicArray, 1, 2, 20);
// 取值操作示例
printf("(0, 0)位置的值: %d\n", getValue(dynamicArray, 0, 0));
printf("(1, 2)位置的值: %d\n", getValue(dynamicArray, 1, 2));
freeDynamic2DArray(dynamicArray, rows);
return 0;
}