C语言 二维数组动态分配和释放

C语言动态分配二维数组空间 方法二: 当成一维数组来分配。方法一: 指针的指针。 阅读详情

转载:http://www.cnblogs.com/superglass/archive/2011/04/15/2016861.html

C 二维数组动态分配和释放

(1)已知第二维
Code-1
char (*a)[N]; //指向数组的指针
a = (char (*)[N])malloc(sizeof(char *) * m);
printf("%d\n", sizeof(a)); //4,指针
printf("%d\n", sizeof(a[0])); //N,一维数组
free(a);
(2)已知第一维
Code-2
char* a[M]; //指针的数组
int i;
for(i=0; i<M; i++)
a[i] = (char *)malloc(sizeof(char) * n);
printf("%d\n", sizeof(a)); //4*M,指针数组
printf("%d\n", sizeof(a[0])); //4,指针
for(i=0; i<M; i++)
   free(a[i]);
(3)已知第一维,一次分配内存(保证内存的连续性)
Code-3
char* a[M]; //指针的数组
int i;
a[0] = (char *)malloc(sizeof(char) * M * n);
for(i=1; i<M; i++)
a[i] = a[i-1] + n;
printf("%d\n", sizeof(a)); //4*M,指针数组
printf("%d\n", sizeof(a[0])); //4,指针
free(a[0]);
(4)两维都未知
Code-4
char **a;
int i;
a = (char **)malloc(sizeof(char *) * m); //分配指针数组
for(i=0; i<m; i++)
{
a[i] = (char *)malloc(sizeof(char) * n); //分配每个指针所指向的数组
}
printf("%d\n", sizeof(a)); //4,指针
printf("%d\n", sizeof(a[0])); //4,指针
for(i=0; i<m; i++)
{
free(a[i]);
}
free(a);
(5)两维都未知,一次分配内存(保证内存的连续性)
Code-5
char **a;
int i;
a = (char **)malloc(sizeof(char *) * m); //分配指针数组
a[0] = (char *)malloc(sizeof(char) * m * n); //一次性分配所有空间
for(i=1; i<m; i++)
{
a[i] = a[i-1] + n;
}
printf("%d\n", sizeof(a)); //4,指针
printf("%d\n", sizeof(a[0])); //4,指针
free(a[0]);
free(a);
2.C++动态分配二维数组
(1)已知第二维
Code-6
char (*a)[N]; //指向数组的指针
a = new char[m][N];
printf("%d\n", sizeof(a)); //4,指针
printf("%d\n", sizeof(a[0])); //N,一维数组
delete[] a;
(2)已知第一维
Code-7
char* a[M]; //指针的数组
for(int i=0; i<M; i++)
   a[i] = new char[n];
printf("%d\n", sizeof(a)); //4*M,指针数组
printf("%d\n", sizeof(a[0])); //4,指针
for(i=0; i<M; i++)
   delete[] a[i];
(3)已知第一维,一次分配内存(保证内存的连续性)
Code-8
char* a[M]; //指针的数组
a[0] = new char[M*n];
for(int i=1; i<M; i++)
a[i] = a[i-1] + n;
printf("%d\n", sizeof(a)); //4*M,指针数组
printf("%d\n", sizeof(a[0])); //4,指针
delete[] a[0];
(4)两维都未知
Code-9
char **a;
a = new char* [m]; //分配指针数组
for(int i=0; i<m; i++)
{
a[i] = new char[n]; //分配每个指针所指向的数组
}
printf("%d\n", sizeof(a)); //4,指针
printf("%d\n", sizeof(a[0])); //4,指针
for(i=0; i<m; i++)
delete[] a[i];
delete[] a;
(5)两维都未知,一次分配内存(保证内存的连续性)
Code-10
char **a;
a = new char* [m];
a[0] = new char[m * n]; //一次性分配所有空间
for(int i=1; i<m; i++)
{
a[i] = a[i-1] + n; //分配每个指针所指向的数组
}
printf("%d\n", sizeof(a)); //4,指针
printf("%d\n", sizeof(a[0])); //4,指针
delete[] a[0];
delete[] a;
多说一句:new和delete要注意配对使用,即有多少个new就有多少个delete,这样才可以避免内存泄漏!
3.静态二维数组作为函数参数传递
如果采用上述几种方法动态分配二维数组,那么将对应的数据类型作为函数参数就可以了。这里讨论静态二维数组作为函数参数传递,即按照以下的调用方式:
int a[2][3];
func(a);
C语言中将静态二维数组作为参数传递比较麻烦,一般需要指明第二维的长度,如果不给定第二维长度,则只能先将其作为一维指针传递,然后利用二维数组的线性存储特性,在函数体内转化为对指定元素的访问。
首先写好测试代码,以验证参数传递的正确性:
(1)给定第二维长度
Code-11
void func(int a[][N])
{
printf("%d\n", a[1][2]);
}
(2)不给定第二维长度
Code-12
void func(int* a)
{
printf("%d\n", a[1 * N + 2]); //计算元素位置
}

注意:使用该函数时需要将二维数组首地址强制转换为一维指针,即func((int*)a);


OSGEarth 基于鼠标位置缩放 说明 osgearth 原有漫游器EarthManipulator 不支持此功能,所以需要修改此漫游器代码,其中主要原理就是在缩放的同时也要改变当前漫游器中心焦点的位置,从而保持鼠标指定点的位置缩放是不改变。 核心代码修改部分 EarthManipulator 的头文件zoom方法添加参数view /** * Zoom the camera using delt... 阅读详情

相关推荐

Java 处理地理信息数据[DEM TIF文件数据获取高程]

EPSG 是一个国际标准,用于唯一标识地理坐标系和投影坐标系。

两点 1276

[原创]二维数组的动态分配及参数传递

1. C语言动态分配二维数组 (1)已知第二维 Code-1 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(char *) * m); printf("%d\n", sizeof(a));//4,指针 printf("%d\n", sizeof(a[0]));//N,一维数组 free(a)...

weixin_30387423的博客 558

莫兰指数stata命令_一文读懂16个sp系列stata空间计量命令及应用

spcompress:Compress Stata-format shapefile压缩数据成stata格式的shapefile2、Looking at data/观测数据2、Looking at data/观测数据grmap:Graph choropleth maps绘制等值区域图spdistance:Calculator for distance between places计算区域之间距离3...

weixin_39719989的博客 822

【笔记】C++/C--动态二维数组的内存分配与释放:C语言 malloc 和 free,C++ new 和 delete

要注意配对使用,即有多少个。,这样才可以避免内存泄漏!

nyist_yangguang的博客 2028

阿里云人工智能工程师ACA认证免费课程学习笔记

阿里云人工智能工程师ACA认证免费课程学习笔记

engchina的专栏 2013

brpc组件bvar源码解析(一)简介、使用和类的关系

bvar是brpc中的一个重要组件,brpc内部有很多builtin监控都是bvar实现的。 brpc文档介绍bvar“几乎不会给程序增加性能开销,也快于竞争频繁的原子操作”。它的原理是:多线程累加一个计数器时,每个线程只累加私有的变量而不参与全局竞争,因此写时没有锁的竞争;在读取时累加所有线程的私有变量。虽然读比之前慢多了,但写就快多了,因此它使用写多读少的场景,例如统计、监控场景。 1.使用 // bvar::Adder<T>用于累加,下面定义了一个统计read error总数的Adder。

华秋实的专栏 1852

C++/C--动态二维数组的内存分配与释放:malloc 和 free&&new 和 delete

/分配每个指针所指向的数组。//分配每个指针所指向的数组。//分配每个指针所指向的数组。//一次性分配所有空间。//一次性分配所有空间。要注意配对使用,即有多少个。,这样才可以避免内存泄漏!

实力派,无需多言! 999

使用kali对局域网内的主机进行远程控制

输入命令:hydra -l administrator -P/usr/share/woerdlists/rockyou.txt 192.168.100.241 smb -V。账户(adminitrator)密码:123456 【一般账户都是我们知晓了,如果不知道账户进行破解那几乎不太可能,密码如果设置的特别复杂无规律也是特别难破解的】【-r:扫描整个网段 后面就是设置 192.168.241.100/24的网络地址段 为 192.168.241.0/24 0和/24之间不要空格】

2301_77599769的博客 2279

C++数组的正确释放方式

#include <stdio.h> #include <stdlib.h> int main() { char *p1 = new char; char *p2 = new char[1000]; delete p1; delete[] p2; return 0; }

rjc_lihui的专栏 6992

Verilator+VSCode实战:5分钟搞定Verilog语法检查与波形调试

本文详细介绍了如何将Verilator仿真器与VSCode编辑器高效集成,打造极速的Verilog开发工作流。通过环境配置、实时语法检查、一键仿真与波形生成等实战技巧,帮助IC设计工程师在几分钟内完成从代码编写到波形调试的全过程,大幅提升中小规模模块的验证效率。

weixin_28454475的博客 469

【RT-DETR实战】117、华为昇腾CANN部署探索:从模型转换到推理踩坑实录

本文总结了RT-DETR模型在昇腾310B芯片上部署的关键挑战与解决方案。主要遇到四大问题:1)模型转换时需注意ONNX导出设置,建议先固定尺寸验证;2)内存布局差异导致推理异常,需精确匹配NHWC/NCHW格式;3)流水线并发优化中内存复用和异步处理是关键;4)调试阶段需利用专用工具逐层比对。作者提出六条实用建议,包括小尺寸验证、预处理对齐、内存池设计等,强调部署是持续适配过程,需建立完整的测试体系应对工具链迭代。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 191

C语言 二维数组(指针)动态分配和释放

http://blog.youkuaiyun.com/handsome_926/article/details/8233744 C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据。如果我们将总长128位的指令分别按照16位、32位、64位为单位进行编辑的话:旧的16位处理器,比如Inte

bytxl的专栏 1969

RH850从0搭建Autosar开发环境【2】- Davinci Configurator配置工程导入DBC与CDD文件

Davinci Configurator配置工程导入DBC与CDD文件,开始Autosar开发

weixin_42412049的博客 8153

c语言动态分配二维数组和释放

#include <stdio.h> #include <malloc.h> int main() { int **a; int i, j; a = (int**)malloc(sizeof(int*)*3);//为二维数组分配3行 for (i = 0; i < 3; ++i){//为每列分配4个大小空间 a[i]...

Mr番茄蛋的博客 940

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C语言 二维数组动态分配和释放 [转]

C 二维数组动态分配和释放 (1)已知第二维 Code-1 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(char *) * m); printf("%d\n", sizeof(a));//4,指针 printf("%d\n", sizeof(a[0]));//N,一维数组 ...

weixin_30371469的博客 83

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

c\c++二维数组动态分配和释放

C 二维数组动态分配和释放 (1)已知第二维 Code-1 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(char *) * m); printf("%d\n", sizeof(a));//4,指针 printf("%d\n", sizeof(a[0]));//N,一维数组 free(a); (2)已知第一维

生命不息 奋斗不止 443

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C语言 二维数组(指针)动态分配和释放(转)

C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据。如果我们将总长128位的指令分别按照16位、32位、64位为单位进行编辑的话:旧的16位处理器,比如Intel 80286 CPU需要8个指令,32位的处理器需要4个指令,而64位处理器则只要两个指令,显然,在工作频率相同的情况下...

weixin_30615767的博客 325

动态分配二维数组

使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小。示例代码,分配3行4列二维数组: #include <stdio.h> #include <malloc.h> int main() { int **a; int i, j; a = (int**)malloc(sizeof(int*)*3);//为二维数组分配3行 f...

偶尔记录些东西 1062

c语言malloc()动态分配二维数组

动态分配二维数组很经常会用到,但新手总是会出错,下面的模板来自网上的回答,拷贝到这里方便随时查看。 include

bin70的博客 1842

指针数组、数组指针、二维数组动态分配内存

C 二维数组动态分配和释放 已知第二维 char (*a)[N];//指向数组的指针 a = (char ()[N])malloc(sizeof(char ) * m); printf(“%d\n”, sizeof(a));//4,指针 printf(“%d\n”, sizeof(a[0]));//N,一维数组 free(a); 已知第一维 char* a[M];//指针的数组 in

白驹过隙 1万+

程序员必备——C二维数组动态分配,参数传递

c语言书中,很少谈到如何用malloc动态初始化一个二维数组。但是在二维数组作为参数进行传递时,会常用到。下面代码中,动态初始化二维数组并作为参数进行传递,注意的是动态申请内存后后要记得释放,养成良好习惯。 #include<stdio.h> #include <stdlib.h> int** test(int m, int n) { int** a=(int**)...

qq_24263553的博客 432

如何在C/C++中动态分配二维数组

如何在C/C++中动态分配二维数组 在C/C++中动态分配二维数组可以先申请一维的指针数组,然后该数组中的每个指针再申请数组,这样就相当于二维数组了,但是这种方法会导致每行可能不相邻,从而访问效率比较低。如何申请连续的二维数组了?本文将分别三个方面讲解: 一.动态申请列大小固定的二维数组 二.C语言中动态申请连续的二维数组 三.C++语言中动态申请连续的二维数组 一.动态申请列大小固定的二维数组...

huobengluantiao8 3883
上一篇: C++新手必问之头文件
下一篇: C语言中动态分配二维数组
楚小狂
博客等级 码龄16年 57粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值