二维动态数组的内存分配详解

🧩 二维动态数组的内存分配详解

一、示例代码

#include <stdio.h>
#include <stdlib.h>

int main() {
    int rows = 2, cols = 3;

    int **matrix = (int **)malloc(rows * sizeof(int *));
    for (int i = 0; i < rows; i++) {
        matrix[i] = (int *)malloc(cols * sizeof(int));
    }

    matrix[0][0] = 10;

    printf("%d\n", matrix[0][0]);

    for (int i = 0; i < rows; i++)
        free(matrix[i]);
    free(matrix);
    return 0;
}

二、内存分配步骤

1️⃣ 分配行指针数组

int **matrix = (int **)malloc(rows * sizeof(int *));

假设 rows = 2,每个指针 8 字节(在 64 位系统中)。
分配 16 字节内存:

地址 内容 含义
0x1000 指向第1行的指针 matrix[0]
0x1008 指向第2行的指针 matrix[1]

此时 matrix[0]、matrix[1] 尚未初始化。


2️⃣ 为每行分配内存

for (int i = 0; i < rows; i++) {
    matrix[i] = (int *)malloc(cols * sizeof(int));
}

假设 cols = 3,每个 int 占 4 字节。
每行分配 12 字节:

行号 malloc 返回地址 占用字节 含义
matrix[0] 0x2000 12 存放第1行的3个整数
matrix[1] 0x3000 12 存放第2行的3个整数

3️⃣ 存储数据

matrix[0][0] = 10;

等价于:

*(*(matrix + 0) + 0) = 10;

即操作地址:

*(0x2000) = 10;

三、最终内存结构图

matrix (int **)
 ┌──────────────┐
 │ 0x1000       │   ← matrix 变量本身
 └─────┬────────┘
       │
       ▼
 ┌──────────────┐
 │ 0x2000       │ → matrix[0] → [10][ ][ ]  (0x2000 ~ 0x200B)
 │ 0x3000       │ → matrix[1] → [ ][ ][ ]    (0x3000 ~ 0x300B)
 └──────────────┘

四、释放顺序

for (int i = 0; i < rows; i++)
    free(matrix[i]);   // 释放每一行的内存

free(matrix);           // 最后释放存放行指针的区域

✅ 总结

操作 分配内容 地址举例 大小
malloc(rows * sizeof(int *)) 存放每一行的指针 0x1000 16 字节
malloc(cols * sizeof(int)) 存放每行数据 0x20000x3000 每行 12 字节
matrix[0][0] 存放第一个元素 0x2000 4 字节
posted @ 2025-10-30 00:13  灰灰奋斗录  阅读(0)  评论(0)    收藏  举报