| 查看: 319 | 回复: 5 | |||
| 当前主题已经存档。 | |||
darksea_00木虫 (小有名气)
|
[交流]
【求助】C语言中动态分配与释放内存
|
||
|
麻烦大家帮我看看我写的这段分配三维数组的程序对不对,谢谢! double ***Malloc3DArray(int nxx,int nyy, int nzz) { double ***p; int i,j; p = (double ***)malloc(nxx*sizeof(double**)); if(!p) return NULL; for(i=0; i p =(double**)malloc(nyy*sizeof(double*)); if(!(p)) return NULL; for(j=1;j p[j]=(double *)malloc(nzz*sizeof(double)); if(!(p[j])) return NULL; } } return p; } void free3DArray(double ***p, int nxx) { int i,j; for(i=0; i for(j=0;j free( p[j] ); } free( p ); } free(p); } |
» 猜你喜欢
有没有人能给点建议
已经有5人回复
假如你的研究生提出不合理要求
已经有12人回复
实验室接单子
已经有7人回复
全日制(定向)博士
已经有5人回复
萌生出自己或许不适合搞科研的想法,现在跑or等等看?
已经有4人回复
Materials Today Chemistry审稿周期
已经有4人回复
参与限项
已经有3人回复
对氯苯硼酸纯化
已经有3人回复
所感
已经有4人回复
要不要辞职读博?
已经有7人回复
woshilsh
荣誉版主 (职业作家)
- 应助: 43 (小学生)
- 贵宾: 10.33
- 金币: 21115.1
- 散金: 737
- 红花: 22
- 帖子: 3777
- 在线: 639.7小时
- 虫号: 293038
- 注册: 2006-11-04
- 专业: 计算机应用技术
- 管辖: 仿真模拟

2楼2008-11-24 17:06:25
coldwind042
金虫 (正式写手)
- 应助: 0 (幼儿园)
- 贵宾: 0.03
- 金币: 543.5
- 红花: 3
- 帖子: 630
- 在线: 175.2小时
- 虫号: 154293
- 注册: 2006-01-03
- 性别: GG
- 专业: 水工结构和材料及施工
3楼2008-11-24 19:45:38
pathfinder126
木虫 (正式写手)
- 应助: 1 (幼儿园)
- 金币: 2317.8
- 红花: 1
- 帖子: 658
- 在线: 108.3小时
- 虫号: 449727
- 注册: 2007-11-02
- 性别: GG
- 专业: 流体力学

4楼2008-11-25 09:46:44
yalefield
金虫 (文坛精英)
老汉一枚
- 程序强帖: 3
- 应助: 129 (高中生)
- 贵宾: 0.17
- 金币: 21238.9
- 散金: 3440
- 红花: 66
- 帖子: 12101
- 在线: 759.1小时
- 虫号: 96063
- 注册: 2005-10-07
- 专业: 高等教育学
- 管辖: 计算模拟
问题多多啊
★ ★ ★ ★ ★
kuhailangyu(金币+2,VIP+0):欢迎+支持~~,感谢给予解答!
lei0736(金币+3,VIP+0):继续奖励 呵呵
kuhailangyu(金币+2,VIP+0):欢迎+支持~~,感谢给予解答!
lei0736(金币+3,VIP+0):继续奖励 呵呵
|
(1)释放不完全 调用时,三级分配;释放时,只释放了一级。 正确的释放(顺便修改了几个错误,如用了中文的分号等): void free3DArray(double ***p, int nxx, int nyy) { int a, m; for(a=0; a < nxx; a++) { for(m=0; m < nyy; m++) { free( p[a][m] ); p[a][m] = 0; } free( p[a] ); p[a] = 0; } free(p); p = 0; } (2)释放要把指针赋值为0(或者NULL) 你可能注意到,每次释放,都要把指针赋值为0(或者NULL)。 这是因为free()函数不会把指针赋值为0。 再有,你用void free3DArray(double ***p, int nxx, int nyy)这种方式设计函数,p的取值,尽管在函数内部已经赋值为0,但函数退出后,新的p值并没有改变。 例如: double *** q = Malloc3DArray(100,50, 20); printf("Before:%p\n", q); free3DArray(q, 100, 50); printf("After:%p\n", q); 你会看到,在free3DArray()前后,打印的内容没有变化。 补救的办法: free3DArray(q, 100, 50); q=NULL; 总之,这种函数的设计并不是个好办法。 应该设计成如下的形式,至于具体怎么做,你要自己考虑喽。 int Malloc3DArray(double ****p, int nxx,int nyy, int nzz); int free3DArray(double ****p, int nxx, int nyy); 思考:为什么要用四级指针? [ Last edited by yalefield on 2008-11-25 at 10:51 ] |
5楼2008-11-25 10:46:59
darksea_00
木虫 (小有名气)
- 应助: 0 (幼儿园)
- 金币: 2886.8
- 红花: 1
- 帖子: 139
- 在线: 59.8小时
- 虫号: 585424
- 注册: 2008-08-08
- 专业: 聚合物共混与复合材料
6楼2008-12-10 04:50:18












回复此楼