You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:39:04