免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4519 | 回复: 5
打印 上一主题 下一主题

请教:建立了二维动态数组后我该如何释放分配的内存? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-13 15:00 |只看该作者 |倒序浏览
我在Debian下运行了如下的建立二维动态数组的c源程序,没有什么问题,至少我用gcc -o 2 2.c运行后是正确的。源程序如下(或者见附件):
#include<stdio.h>
#include<stdlib.h>
void frarray(int **a, int m){                //释放二维矩阵所占用的内存,m表示矩阵的行数
int i;
for(i=0;i<m;i++){
free(a[i]);
}
free(a);
}

int **mkarray(int m,int n){                //创建mxn的整型矩阵
int **a,i;
a=(int **)malloc(sizeof(int *)*m);
for(i=0;i<m;i++){
a[i]=(int *)malloc(sizeof(int)*n);
}
return a;                                //这里把创建好的矩阵返回
//frarray(a,m);                                //我不清楚是否应该在这里进行内存释放?
}

int **iparray(int **a, int m, int n){        //为mxn矩阵赋值
int i,j;
for(i=0;i<m;i++){
  for(j=0;j<n;j++){
    a[i][j]=i+j;
  }
}
return a;
}

void prarray(int **a, int m, int n){        //打印mxn矩阵
int i,j;
for(i=0;i<m;i++){
  for(j=0;j<n;j++){
    printf("%d ",a[i][j]);
  }
printf("\n");
}
}

void main(void){
int m,n,**a;
m=7;
n=8;
a=mkarray(m,n);                                //创建mxn数组,没有赋值
a=iparray(a,m,n);                        //为数组赋值
prarray(a,m,n);                                //显示数组
frarray(a,m);                                //释放所分配的内存空间,在这里释放对吗?
}

我现在的问题是:
(1) 第48行中释放内存的方法正确否?
(2)可否在第18行处释放内存,或者说该不该在那里就释放内存(毕竟已经把创建好的矩阵返回了)?
谢谢!

2.c.tar.gz

669 Bytes, 下载次数: 12

源文件

论坛徽章:
1
15-16赛季CBA联赛之佛山
日期:2015-12-14 17:57:31
2 [报告]
发表于 2012-02-14 14:41 |只看该作者
1 应该在最后释放
2 return后没法执行语句,如果在return前释放也不行,那样就打印不出东西了
3 没必要用动态的

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
3 [报告]
发表于 2012-02-14 15:18 |只看该作者
1. 代码鬼画符呀,连基本的缩进都没有
2. 没看到有“二维动态数组”,真正的 二维数组 的 第一维元素应该是个 一维数组,而非一个地址
3. 文件中还包含 0xB0 这样的字符,不知道是怎么来的
4. malloc和main等就不多说了

经过艰苦整理,保持原作者的编码风格,代码终于在gcc4.6.1上编译通过(-std=c99)
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void frarray(int **a, int m){                        //释放二维矩阵所占用的内存,m表示矩阵的行数
  4.         for(int i=0;i<m;++i){
  5.                 free(a[i]);
  6.         }
  7.         free(a);
  8. }

  9. int **mkarray(int m,int n){                                //创建mxn的整型矩阵
  10.         int **a=malloc(sizeof(int*)*m);
  11.         for(int i=0;i<m;++i){
  12.                 a[i]=malloc(sizeof(int)*n);
  13.         }
  14.         return a;                                                        //这里把创建好的矩阵返回
  15. }

  16. int **iparray(int **a, int m, int n){        //为mxn矩阵赋值
  17.         for(int i=0;i<m;++i){
  18.                 for(int j=0;j<n;++j){
  19.                         a[i][j]=i+j;
  20.                 }
  21.         }
  22.         return a;
  23. }

  24. void prarray(int **a, int m, int n){        //打印mxn矩阵
  25.         for(int i=0;i<m;++i){
  26.                 for(int j=0;j<n;++j){
  27.                         printf("%d ",a[i][j]);
  28.                 }
  29.                 printf("\n");
  30.         }
  31. }

  32. int main(void){
  33.         int m=7, n=8;
  34.         int **a=mkarray(m,n);                                //创建mxn数组,没有赋值
  35.         iparray(a,m,n);                                                //为数组赋值
  36.         prarray(a,m,n);                                                //显示数组
  37.         frarray(a,m);                                                //释放所分配的内存空间,在这里释放对吗?
  38.        
  39.         return 0;
  40. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-02-14 18:42 来自手机 |只看该作者
第18行的frarray根本就执行不了啊
在最后释放是对的
                 
         个人看法

论坛徽章:
0
5 [报告]
发表于 2012-02-15 14:00 |只看该作者
本帖最后由 zhiyizhi 于 2012-02-15 14:05 编辑

谢谢各位的回复!特别谢谢bruceteen的批评!我当时是用gedit写的,很不规范!现在用scite重写了一遍,并做了适当修改 4.c.tar.gz (827 Bytes, 下载次数: 9) ,运行后(文件名是4.c)结果没有太多问题,以下是运行结果:
[13:56:58@/media/backup/c-programing/array/test]$ gcc -Wall 4.c -g -o 4
[13:57:08@/media/backup/c-programing/array/test]$ valgrind --tool=memcheck --leak-check=yes ./4
==5799== Memcheck, a memory error detector
==5799== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==5799== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==5799== Command: ./4
==5799==
请输入矩阵的行数和列数:
4 6
所得的 4 行 6 列矩阵为
0      1      2      3      4      5     
1      2      3      4      5      6     
2      3      4      5      6      7     
3      4      5      6      7      8     
==5799==
==5799== HEAP SUMMARY:
==5799==     in use at exit: 0 bytes in 0 blocks
==5799==   total heap usage: 5 allocs, 5 frees, 128 bytes allocated
==5799==
==5799== All heap blocks were freed -- no leaks are possible
==5799==
==5799== For counts of detected and suppressed errors, rerun with: -v
==5799== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)


另外,我用的是Debian Squeeze,编码是en_US.utf8,这可能是出现乱码的原因!现在我知道自己的问题出在对return函数没有正确、全面地认识!

论坛徽章:
0
6 [报告]
发表于 2012-02-16 10:29 |只看该作者
malloc 了多少次,free多少次就对了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP