`
473687880
  • 浏览: 483897 次
文章分类
社区版块
存档分类
最新评论

C语言为二维数组动态分配内存的问题

阅读更多

C语言中动态分配一位数组是很简单的,但是没有可以直接对二维数组进行动态分配的函数,因此,要相对二维数组动态分配内存,便要借助于一位数组来实现,具体如下:

假设要为一个n*m的二维数组分配动态内存

首先需要注意的是,不要这样一次性分配为数组内存空间:

int **arr = (int**)malloc(n *m * sizeof(int));

正确的做法是先分配行,再分配列。

释放内存的时候,要先释放列,再释放行。

注意,顺序反了的话,会把列的地址擦除,导致释放列时内存时找不到地址,程序崩溃。

正确的分配空间代码如下:

int **arr = (int **)malloc(n*sizeof(int *));
for(i=0;i<n;i++)
arr[i] = (int *)malloc(m*sizeof(int));

正确的释放空间代码如下:

for (i = 0; i < n; i++)
free(arr[i]);
/
*释放列*/

free(arr);/*释放行*/


注:这种分配方式得到的其实并不是真正意义上的二维数组,因为其行与行之间的内存并不连续,虽然可以用下标arr[i][j]的方式访问,但当用指向该二维数组的指针来访问时候,不能通过指针值的增加来跨行获取元素,不过这种情况一般用的也不多,因此上述分配方式在大多数情况下的操作都能得到正确的结果。

一篇文章分析的不错,源地址:http://tsindahui.blog.sohu.com/84512010.html

分享到:
评论

相关推荐

    C语言 二维数组 malloc 矩阵加法 乘法 转置

    C语言 实在 矩阵的乘法 加法 转置 各个子涵数都有通用性,内存的分配是使用二维数组动态 malloc 分配

    关于c语言二维数组初始化

    C语言中的二维数组初始化可以通过以下几种方式实现: 使用花括号进行初始化:在定义二维数组时,直接使用花括号将每...使用动态内存分配进行初始化:首先为二维数组的每一行分配内存,然后再为每一行的每个元素分配内存

    C指针系列之动态申请二维数组

    使用C的二级指针动态分配二维数组,在linux和vs2010下均编译通过。

    c语言动态数组的实现方法

    该项目利用c语言的malloc函数实现了一维和二维动态数组的创建,并且二维数组采用了两种方式。该项目对了解程序的内存分配具有很好的益处。

    C语言中多维数组的内存分配和释放(malloc与free)的方法

    如果要给二维数组(m*n)分配空间,代码可以写成下面: 代码如下:char **a, i; // 先分配m个指针单元,注意是指针单元 // 所以每个单元的大小是sizeof(char *) a = (char **) malloc(m * sizeof(char * )); // 再分配n...

    八十多条C语言基础教程

    c 动态分配内存法定义数组 c 返回二维数组 c 方向键键码 c 改变字体颜色 c 绘制图形 c 获得鼠标当前位置坐标 c 检测键盘按键 c 检测鼠标按下事件 c 将整数转换成二进制数并存放到数组中 c 结构体问题 c 使用winsock...

    谭浩强C语言设计第三版.pdf

     6.2.3 内存的动态分配与动态数组的建立  6.3 指针与函数  6.3.1 指针参数与函数的地址传送调用  6.3.2 带参数的主函数  6.3.3 返回指针值的函数  6.3.4 指向函数的指针  习题六 第7章 用户定制数据类型  ...

    chp6 linux.rar

     一维数组的定义、引用及初始化  一维数组的内存分配  二维数组的定义、初始化  二维数组的内存分配  字符数组  字符串的定义、输入输出  字符串处理函数

    谭浩强c语言程序设计

    7.2 二维数组的定义和引用 86 7.2.1 二维数组的定义 86 7.2.2 二维数组元素的引用 86 7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 7.3.1 字符数组的定义 89 7.3.2 字符数组的初始化 89 ...

    C语言程序设计(谭浩强)第三版

     6.2.2怎样引用二维数组的元素  6.2.3二维数组的初始化  6.2.4二维数组程序举例  6.3.字符数组 6.3.1怎样定义字符数组  6.3.2字符数组的初始化  6.3.3怎样引用字符数组中的元素  6.3.4字符串和字符串结束标志...

    谭浩强 C语言程序设计 教程全书 Word版

    7.2.2 二维数组元素的引用 6 7.2.3 二维数组的初始化 7 7.2.4 二维数组程序举例 9 7.3 字符数组 9 7.3.1 字符数组的定义 9 7.3.2 字符数组的初始化 9 7.3.3 字符数组的引用 10 7.3.4 字符串和字符串结束标志 10 ...

    谭浩强版c语言程序设计

    7.2.2 二维数组元素的引用 86 7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 7.3.1 字符数组的定义 89 7.3.2 字符数组的初始化 89 7.3.3 字符数组的引用 90 7.3.4 字符串和字符串结束标志 ...

    《C语言程序设计》谭浩强

    7.2 二维数组的定义和引用 86 7.2.1 二维数组的定义 86 7.2.2 二维数组元素的引用 86 7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 7.3.1 字符数组的定义 89 7.3.2 字符数组的初始化 89 ...

    你必须知道的495个C语言问题

    6.18 当我向一个接受指针的指针的函数传入二维数组的时候,编译器报错了。 6.19 我怎样编写接受编译时宽度未知的二维数组的函数? 6.20 我怎样在函数参数传递时混用静态和动态多维数组? 数组的大小 6.21 当...

    C语言讲义.doc

    1.1.17 二维数组名作为函数参数 58 1.1.18 const关键字保护数组内容 58 1.1.19 指针做为函数的返回值 58 1.1.20 指向函数的指针 59 1.1.21 把指向函数的指针做为函数的参数 60 1.1.22 memset,memcpy,memmove函数 61 ...

    《你必须知道的495个C语言问题》

    书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别给出了解答,而且结合代码示例阐明要点。 《你必须知道的495个C语言问题》结构...

    C语言入门课程代码

    .txt文档教程+对应.c源代码,包括课程:数据类型,运算符,分支循环,数组,二维数组,函数,文件操作,指针,字符串,预处理,结构体,动态内存分配,查找排序,单链表,双链表,项目,C语言基础测试。

Global site tag (gtag.js) - Google Analytics