1、分配连续内存块(推荐)
常见的分配方式,分配一个大的内存块,然后按行或列进行索引。相比其他方法,它的内存布局是连续的,因此访问速度快,也更易于释放内存。
#include <stdio.h> #include <stdlib.h> int main() { int rows = 3, cols = 4; // 分配一个连续的内存块 int *data = (int *)malloc(rows * cols * sizeof(int)); if (data == NULL) { perror("Memory allocation failed"); return 1; } // 创建指针数组,每个指针指向二维数组的一行 int **array = (int **)malloc(rows * sizeof(int *)); for (int i = 0; i < rows; i++) { array[i] = data + i * cols; } // 使用二维数组 array[1][2] = 42; printf("array[1][2] = %d\n", array[1][2]); // 释放内存 free(array); free(data); return 0; }
2、分配不连续的内存块(每行独立分配)
为数组的每一行独立分配内存,虽然操作简单,但每一行在内存中的位置可能不是连续的。
#include <stdio.h> #include <stdlib.h> int main() { int rows = 3, cols = 4; // 分配指针数组 int **array = (int **)malloc(rows * sizeof(int *)); for (int i = 0; i < rows; i++) { array[i] = (int *)malloc(cols * sizeof(int)); } // 使用二维数组 array[1][2] = 42; printf("array[1][2] = %d\n", array[1][2]); // 释放内存 for (int i = 0; i < rows; i++) { free(array[i]); } free(array); return 0; }
3、单指针模拟二维数组
C语言中,二维数组在内存中是按行顺序存储的。可以利用这个特性,使用单指针来模拟二维数组。其基本思想是将二维数组看作是一个一维数组,通过计算偏移量来访问元素,使用单个指针,模拟二维数组的行为。
#include <stdio.h> #include <stdlib.h> int main() { int rows = 3, cols = 4; // 分配一块连续的内存 int *array = (int *)malloc(rows * cols * sizeof(int)); if (array == NULL) { perror("Memory allocation failed"); return 1; } // 使用一维数组模拟二维数组 array[1 * cols + 2] = 42; printf("array[1][2] = %d\n", array[1 * cols + 2]); // 释放内存 free(array); return 0; }
4、多维数组的内存分配错误示例
一个常见的错误示例,程序员误以为只分配一个指针数组就足够了:
#include <stdio.h> #include <stdlib.h> int main() { int rows = 3, cols = 4; // 错误:仅分配了指针数组,没有分配行内存 int **array = (int **)malloc(rows * sizeof(int *)); // 未正确分配内存会导致段错误(Segmentation Fault) array[1][2] = 42; // 错误! // 释放内存(这也会导致未定义行为) free(array); return 0; }
5、使用示例
使用连续内存块,因为它具有更高的访问速度,并且释放内存时不容易出错。确保每一维都分配了正确的内存,避免段错误或未定义行为。无论使用哪种方法,都需要确保使用 free()
释放所有分配的内存,以避免内存泄漏。
#include <stdio.h> #include <stdlib.h> int main() { int rows = 3, cols = 4; // 分配连续的内存块 int *data = (int *)malloc(rows * cols * sizeof(int)); int **array = (int **)malloc(rows * sizeof(int *)); for (int i = 0; i < rows; i++) { array[i] = data + i * cols; } // 使用数组 array[2][3] = 99; printf("array[2][3] = %d\n", array[2][3]); // 释放内存 free(array); free(data); return 0; }