请教关于动态内存分配释放问题

snake19853100 2012-07-11 03:50:51
比如
char**p=NULL;
int i=0;
p=(char**)malloc(5*sizeof(char*));
for(i=0;i<5;i++)
*(p+i)=(char*)malloc(5*sizeof(char));
请问如果只free(p),p先不指向NULL,那是不是连带着第二次分配的内存也释放了?如果没释放的话,那是否还可以用p来引用内存中的数据?
...全文
142 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
内存空间的申请与释放要成对出现,才能更好的避免内存泄露。
etora 2012-07-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

C/C++ code
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
p=(int **)malloc(4*sizeof(int *));
if (NULL==p) return;
for (i=0;i<4;i++) {
……
[/Quote]
学习.......
Ever_lover 2012-07-11
  • 打赏
  • 举报
回复
申请就得释放 。。
赵4老师 2012-07-11
  • 打赏
  • 举报
回复
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
p=(int **)malloc(4*sizeof(int *));
if (NULL==p) return;
for (i=0;i<4;i++) {
p[i]=(int *)malloc(5*sizeof(int));
if (NULL==p[i]) return;
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
p[i][j]=i*5+j;
}
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
printf(" %2d",p[i][j]);
}
printf("\n");
}
for (i=0;i<4;i++) {
free(p[i]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19
wansbest 2012-07-11
  • 打赏
  • 举报
回复
不会吧!要你做个实验竟然得出这么一个结论!!
ljq550000 2012-07-11
  • 打赏
  • 举报
回复
对同一款内存free两次会崩溃吧 应该标准化编程 这么做会为你埋下太多的隐患 free的地址内容有时是可以访问到的 但是你这么做就是玩火
jiran_tianya 2012-07-11
  • 打赏
  • 举报
回复
char**p=NULL;
int i=0;
p=(char**)malloc(5*sizeof(char*)); (1)
for(i=0;i<5;i++)
*(p+i)=(char*)malloc(5*sizeof(char)); (2)

free(p)释放的是(1)处分配的内存,第二次(2)分配的内存实际并没有释放掉,之所以无法使用p来引用是因为释放掉第一次分配的内存后,无法获取第二次分配的内存的地址。

楼主可以像定义p一样重新定义一个q并为其分配空间,在(2)处将同样的地址值也用q指向的空间保存,这样在free(p)后通过q来调用可以测试出是否释放了第二次分配的内存
snake19853100 2012-07-11
  • 打赏
  • 举报
回复
结果free(p)以后我试图读取二次分配的内存时程序错误退出。看来是全释放了。
W170532934 2012-07-11
  • 打赏
  • 举报
回复
其实楼主自己做个试验就知道的。写个代码验证下

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧