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

C/C++子函数申请对应二维数组的动态内存传给主函数使用

子函数内申请动态内存,给主函数用,见这个帖子:

C语言 子函数调malloc申请内存返回给主函数使用——可行,但要注意!——修改、完全篇_塋malloc函塁申请得来内存空间的禢址,不能堬为函塁塎塅塍。-CSDN博客

这是初步的,主要讲返回原理,但是用的是对应一维数组的内存。实践中碰到需要申请对应二维数组的内存,且,有多个内存需要返回。该怎么写呢?

关于多维指针:

// *p:  指向变量的指针,一级指针
// **p:  指向变量地址的指针,即指向一级指针的指针,二级指针
// ***p:  指向二级指针的指针,即三级指针...以此类推
// 现需要定义一个指向二维数组的指针,二维数组,是用二级指针,即最外面维是指向一维数组的指针,如256个,里面一维,是指向一维数组的指针,如3个元素的数组
// 不管是几维指针,都是一个地址,指向一块内存的首地址,这块内存,一级指针内存是变量类型,如float型,比如有3个float,申请时用指向float的指针指向,即用float*,可以用memset初始化;
// 二级指针内存是一级指针,即是指向变量类型的指针,如指向float*,表示是用float**,初始化时,可以用赋值NULL初始化;
// 以此类推,三级指针的内存是二级指针,即也是指针,表示是用float***,初始化时,也是用NULL赋值初始化...
// 在定义需要返回指针地址的函数(子函数)时,形参是多一维的指针,如需要返回二级指针的地址,则是***,在子函数内使用时,是当二级指针,即**,按照二级指针来申请和初始化。
// 在主函数需要使用子函数时,即需要获取子函数的指针地址,需要用&操作符将传入指针传入,如需传入二维指针a,则用&a作为实参。

最终,只能用入参为三维指针的方式解决。看下面程序:

子函数:

void test1(float*** p1, float*** p2)
{
	int i;

	*p1 = (float**)malloc(3 * sizeof(float*));
	for (i = 0; i < 3; i++) {
		(*p1)[i] = (float*)malloc(4 * sizeof(float));
		memset((*p1)[i], 0, 4 * sizeof(float));
	}
	*p1[0][0] = 1;

	*p2 = (float**)malloc(2 * sizeof(float*));
	for (i = 0; i < 2; i++) {
		(*p2)[i] = (float*)malloc(5 * sizeof(float));
		memset((*p2)[i], 0, 5 * sizeof(float));
	}
	*p2[0][0] = 2;
}

注意理解:

p1是指向二维指针的指针,即三维指针,其值是二维指针,即指向数组的指针数组,指针数组的每个元素(二维指针)指向一个一维数组的首地址,即每个元素值都是一个指针,(*p)表示取值,*p[0]和(*p)[0]表示的是一个地址,但是不是一个意思,用(*p)[0] (*p)[1] ...才能表示二维指针的各个元素,即数组名加和数组元素位置加的区别。

主函数:

void  main() {
    float** p11 = nullptr, **p22 = nullptr;

    test1(&p11, &p22);

    p11[0][0]++;
    p22[0][0]++;

    printf("*p11 = %f\n, *p22 = %f\n", p11[0][0], p22[0][0]);

    free(p11);
    free(p22);
}

这里,test1函数类似统一申请动态内存的函数。类似的,可以写一个统一释放内存的函数,如:

void test2(float*** p1, float*** p2)
{
	int i;

	for (i = 0; i < 3; i++) {
		free((*p1)[i]);
	}
	free(*p1);

	for (i = 0; i < 2; i++) {
		free((*p2)[i]);
	}
	free(*p2);
}

注意释放时维度要和申请时对上。

相关文章:

  • JavaScript数组-遍历数组
  • linux 命令 pidstat,安装此命令,解释其输出,附录 iostat,vmstat、 mpstat
  • Git环境搭建指南
  • 【<foreignObject>元素是什么】
  • 【玩转 Postman 接口测试与开发2_020】(完结篇)DIY 实战:随书示例 API 项目本地部署保姆级搭建教程(含完整调试过程)
  • windows使用clion运行lua文件,并且使用cjson
  • 计算机毕业设计Python+LSTM模型微博舆情分析系统 微博舆情预测 微博爬虫 微博大数据(源码+LW文档+PPT+详细讲解)
  • 【实物仿真】基于Msp430设计的环境监测系统(系统资料)
  • 如何查看端口是否被占用
  • 【Quest开发】全身跟踪
  • 【算法】双指针(下)
  • SMT贴片治具关键设计要素与制造工艺探析
  • 知识库-用户注册接口
  • VSCode AI提效工具,通义灵码前端开发体验
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_get_full_name 函数
  • 数据结构之队列
  • AI Agent架构深度解析:从ReAct到AutoGPT,自主智能体的技术演进与工程实践
  • springsecurity自定义认证
  • 使用QT读取文件,生成json文件
  • leetcode 518. 零钱兑换 II
  • 广西壮族自治区政府主席蓝天立任上被查
  • 武大校长:人工智能不存在“过度使用”,武大不会缩减文科
  • 小米汽车机盖门陷谈判僵局,车主代表称小米表示“退订会造成崩塌”
  • “大型翻车现场”科技满满,黄骅打造现代化港口和沿海新城典范
  • 刘晓庆被实名举报涉嫌偷税漏税,税务部门启动调查
  • 曾犯强奸罪教师出狱后办教培机构?柳州鱼峰区教育局回应