指针的指针实现动态二维矩阵与内存碎片规避
深入指针的二级间接访问,探讨如何用int **管理不规则二维数组,并对比与一维数组模拟二维数组的内存碎片差异。 · 难度:入门 · +10XP
指针的指针与动态矩阵
常规的二维数组在栈上分配连续内存,但遇到不规则行宽(如三角形矩阵)时浪费空间。本教程使用int **p = malloc(rows * sizeof(int*)),再为每行分配不同长度,并讲解为何这种方式可能导致内存碎片。通过对比连续分配一维大数组与二级指针分配,分析cache命中率与malloc开销。
#include <stdio.h>
#include <stdlib.h>
int main() {
int rows = 3;
int **matrix = malloc(rows * sizeof(int*));
int sizes[] = {2, 4, 3};
for (int i = 0; i < rows; i++) {
matrix[i] = malloc(sizes[i] * sizeof(int));
for (int j = 0; j < sizes[i]; j++)
matrix[i][j] = i * 10 + j;
}
// 打印
for (int i = 0; i < rows; i++) {
for (int j = 0; j < sizes[i]; j++)
printf("%d ", matrix[i][j]);
printf("
");
}
// 释放
for (int i = 0; i < rows; i++) free(matrix[i]);
free(matrix);
return 0;
}