当前位置: 首页 > java >正文

C/C++二维数组创建内存分配

文章目录

    • 一、传统“指针的指针”写法(行不连续)
        • C写法
        • cpp写法
    • 二、一次性分配连续内存(推荐)
        • c写法
        • cpp写法
    • 三、极简“扁平化”写法(无二级指针)

一、传统“指针的指针”写法(行不连续)

适用场景:行列都在运行期确定,且每行长度可不同(锯齿数组)。

C写法
#include <stdio.h>
#include <stdlib.h>int main(void) {int rows = 3, cols = 4;/* 1. 先给行指针数组分配空间 */int **arr = (int **)malloc(rows * sizeof(int *));if (!arr) { perror("malloc rows"); return 1; }/* 2. 再给每一行分配列空间 */for (int i = 0; i < rows; ++i) {arr[i] = (int *)malloc(cols * sizeof(int));if (!arr[i]) { perror("malloc cols"); return 1; }}/* 3. 使用:arr[i][j] = ... */for (int i = 0; i < rows; ++i)for (int j = 0; j < cols; ++j)arr[i][j] = i * cols + j;/* 4. 打印验证 */for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j)printf("%2d ", arr[i][j]);putchar('\n');}/* 5. 释放:先逐行,再释放行指针 */for (int i = 0; i < rows; ++i)free(arr[i]);free(arr);return 0;
}
cpp写法
int rows = 3, cols = 4;// 1. 先分配行指针数组
int** arr = new int*[rows];// 2. 再给每一行分配列空间
for (int i = 0; i < rows; ++i)arr[i] = new int[cols];// 3. 使用,赋值
for (int i = 0; i < rows; ++i)for (int j = 0; j < cols; ++j)arr[i][j] = i * cols + j;/* 4. 打印验证 */
for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j)printf("%2d ", arr[i][j]);putchar('\n');
}
// 4. 释放:先逐行,再释放行指针
for (int i = 0; i < rows; ++i)delete[] arr[i];
delete[] arr;
#include <vector>
#include <iostream>int main() {// 3 行 4 列,全部初始化为 0int rows = 3;int cols = 4;std::vector<std::vector<int>> arr(rows, std::vector<int>(cols, 0));// 使用,赋值for (int i = 0; i < rows; ++i)for (int j = 0; j < cols; ++j)arr[i][j] = i * cols + j;/* 4. 打印验证 */for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j)printf("%2d ", arr[i][j]);putchar('\n');}
}

内存示意图:
在这里插入图片描述
缺点:
行与行之间内存不连续,缓存命中率低。
需要多个 new,释放顺序易出错。

二、一次性分配连续内存(推荐)

适用场景:行列已知,需要整块连续内存,效率高,易与 C API 交互。

c写法
#include <stdio.h>
#include <stdlib.h>int main(void) {int rows = 3, cols = 4;/* 1. 一次性申请所有元素 + 行指针数组 */int **arr = (int **)malloc(rows * sizeof(int *));int  *data = (int *)malloc(rows * cols * sizeof(int));/* 2. 让行指针指向连续块的正确偏移 */for (int i = 0; i < rows; ++i)arr[i] = data + i * cols;   // 关键一步/* 3. 使用与赋值 */for (int i = 0; i < rows; ++i)for (int j = 0; j < cols; ++j)arr[i][j] = i * cols + j;/* 4. 打印 */for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j)printf("%2d ", arr[i][j]);putchar('\n');}/* 5. 释放:只需两步,顺序随意 */free(data);free(arr);return 0;
}
cpp写法
int rows = 3, cols = 4;// 1. 一次性申请全部元素
int* data = new int[rows * cols];// 2. 用下标或辅助宏访问
auto at = [&](int r, int c) -> int& { return data[r * cols + c]; };
for (int i = 0; i < rows; ++i)for (int j = 0; j < cols; ++j)at(i, j) = i * cols + j;// 3. 释放
delete[] data;

内存示意图:
data -> [0][1][2][3][4][5][6][7][8][9][10][11] // 连续

优点:

只有一段内存,缓存友好,易 delete[] data 一步释放。

三、极简“扁平化”写法(无二级指针)

如果你不需要 arr[i][j] 语法,可直接用一维指针模拟二维访问:

int rows = 3, cols = 4;
int *a = (int *)malloc(rows * cols * sizeof(int));
a[i * cols + j] = value;   // 访问元素free(a);
http://www.xdnf.cn/news/17384.html

相关文章:

  • 大模型——部署体验gpt-oss-20b
  • 云原生时代的 Linux:容器、虚拟化与分布式的基石
  • 复杂路况误报率↓78%!陌讯轻量化模型在车辆违停识别的边缘计算优化​
  • 抖音AI分身:帮助每个抖音创作者,打造自己的AI分身
  • Kotlin 数据容器 - MutableList(MutableList 概述、MutableList 增删改查、MutableList 遍历元素)
  • STM32学习笔记5-TIM定时器-1
  • cuda算子--softmax算子与优化
  • 如何将视频转为GIF格式,3大视频转为GIF工具
  • 前端开发(HTML,CSS,VUE,JS)从入门到精通!第八天(Vue框架及其安装)(完结篇) 重点 ! ! !
  • AWS 云小白学习指南 (一)
  • 生产管理ERP系统|物联及生产管理ERP系统|基于SprinBoot+vue的制造装备物联及生产管理ERP系统设计与实现(源码+数据库+文档)
  • 【网络自动化】利用Python脚本与计划任务,实现H3C/HPE设备配置无人值守备份
  • 综合项目记录:自动化备份全网服务器数据平台
  • 多级缓存架构:新品咖啡上线引发的数据库压力风暴与高并发实战化解方案
  • 时序数据库-涛思数据库
  • hive-日期拆分为多行
  • 力扣热题100------287.寻找重复数
  • LeetCode快乐数问题
  • CSS:BFC
  • OpenAI 最新开源模型 gpt-oss (Windows + Ollama/ubuntu)本地部署详细教程
  • 安全引导功能及ATF的启动过程(四)
  • 论文阅读:AAAI 2024 ExpeL: LLM Agents Are Experiential Learners
  • 要写新项目了,运行老Django项目找找记忆先
  • 什么是 401(k) 账户?
  • C++简单项目跟练【通讯录管理系统000】
  • Vue 自定义水印指令实现方案解析
  • 惯量时间常数 H 与转动惯量 J 的关系解析
  • 冠雅新品 | 以“无形之光”守护双眸,以“无声之智”浸润生活
  • 【网络运维】Linux:MariaDB 数据库介绍及管理
  • 2025-08-08 李沐深度学习11——深度学习计算