如何使用malloc为多维数组分配与释放内存?
如何使用
malloc为多维数组分配内存? 比如你需要使用arr[6][9]形式的多维数组,首先要避免如下错误写法:
// 警告:错误示例 int **arr = malloc(50 * sizeof(int)); arr[6][9] = 42; // 操作危险!会触发段错误(核心已转储)
错误原因
int **arr是指向int*类型的指针,本质是存储「每行内存地址」的指针数组。上述写法直接分配了int类型的内存空间,寻址arr[i][j]时会把arr[i]里存储的int值当成合法内存地址去访问,属于非法内存访问,因此触发段错误。
正确实现方式
方式1:分步分配(支持不规则二维数组)
这种方式先分配存储行指针的数组,再为每一行单独分配元素内存,支持每行元素数量不同的场景。
分配&释放代码
#include <stdlib.h> #include <stdio.h> // 要分配6行、9列的二维数组 #define ROW 6 #define COL 9 int main() { // 第一步:分配行指针数组,每个元素为int*类型 int **arr = malloc(ROW * sizeof(int*)); if (arr == NULL) { perror("行指针分配失败"); exit(EXIT_FAILURE); } // 第二步:为每一行分配COL个int元素的内存 for (int i = 0; i < ROW; i++) { arr[i] = malloc(COL * sizeof(int)); if (arr[i] == NULL) { // 分配失败时释放之前已申请的内存,避免泄漏 for (int j = 0; j < i; j++) { free(arr[j]); } free(arr); perror("行元素分配失败"); exit(EXIT_FAILURE); } } // 正常读写,注意数组下标从0开始,最大合法下标为arr[ROW-1][COL-1] arr[5][8] = 42; // 释放逻辑 for (int i = 0; i < ROW; i++) { free(arr[i]); // 先释放每一行的元素内存 } free(arr); // 最后释放行指针数组 arr = NULL; // 置空避免野指针 return 0; }
方式2:连续内存分配(性能更优)
这种方式直接分配一整块连续内存,内存布局和静态分配的二维数组完全一致,缓存命中率更高,分配释放逻辑更简单,推荐对性能有要求的场景使用。
分配&释放代码
#include <stdlib.h> #include <stdio.h> #define ROW 6 #define COL 9 int main() { // arr是指向「包含COL个int元素的数组」的指针 int (*arr)[COL] = malloc(ROW * sizeof(*arr)); if (arr == NULL) { perror("内存分配失败"); exit(EXIT_FAILURE); } // 同样支持arr[i][j]形式的读写 arr[5][8] = 42; // 释放仅需一次操作即可 free(arr); arr = NULL; return 0; }
如果使用C99及以上标准,支持变长数组特性,列数COL也可以替换为运行期计算的变量。
两种方式对比
- 分步分配:灵活性更高,支持每行长度不同的不规则二维数组,但是分配释放逻辑复杂,内存不连续,随机访问性能更低
- 连续分配:性能更高,分配释放逻辑简单,但是默认要求列数为编译期常量,仅C99及以上标准支持运行期动态列数
内容的提问来源于stack exchange,提问作者Cheatah
相关产品推荐
相关产品推荐

