链表中malloc分配内存的问题?

north00 2012-07-17 02:47:13
请教:

我在一个函数中给链表不断的追加后续节点,当这个函数结束后,是不是用malloc分配的 内存也就释放掉了,链表的上一个节点实际上指不到下一个节点了?

示例代码如下:

void node_list()
{
struct NODE *ptHead,*ptTail;

add_node(ptHead,ptTail); /*第k次追加节点*/

add_node(ptHead,ptTail); /*第k+1次追加节点*/



}

void add_node(struct NODE *ptHead, struct NODE *ptTail)
{
struct NODE *ptTemp;

/* create a new node*/
ptTemp=(struct NODE *)malloc(sizeof(struct NODE));
...
...


/* add to the list */
ptTail->ptNext=ptTemp; /* ptTemp在该函数结束后是不是就释放掉了?链表中的尾节点在该函数结束后实际上指不到下个节点?*/
ptTail=ptTemp;


}
...全文
537 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
lming_08 2012-07-21
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

我也有点疑问,ptemp在函数调用后是不是就没有了,但malloc的内存还存在,只是ptemp没了?
[/Quote]ptemp只是一个指针变量存于栈内存,但他指向的是堆内存,因此ptemp的销毁与内存没有关系
棋不语 2012-07-21
  • 打赏
  • 举报
回复
我也有点疑问,ptemp在函数调用后是不是就没有了,但malloc的内存还存在,只是ptemp没了?
  • 打赏
  • 举报
回复
不会,malloc分配的空间通常要手动释放
woeser 2012-07-20
  • 打赏
  • 举报
回复
so现在的问题是原来的最后一个节点与新节点连不上了?希望贴完整的代码出来看下,哈哈,正在学习这块,一起讨论下,我所知道的办法就是让链表从表头到表尾遍历一下,找到tail,再让tail->next指向新的temp。
s_april_s 2012-07-19
  • 打赏
  • 举报
回复
楼主可以看看这个帖子

http://www.qnr.cn/pc/erji/C/ziliao/201007/518651.html
xiaoji0507 2012-07-19
  • 打赏
  • 举报
回复
malloc会在堆区开辟一块内存供程序使用。这块内存如果你不手动释放(free)的话会一直持续到应用程序结束后被系统自动收回。这不同于你在函数内部定义的变量。在函数内部定义的变量(没有static关键字修饰的)是存放在栈区。由于在函数调用完毕后有一个平栈的操作,所以这个变量也就消失了。这就是为什么不能在函数中返回一个在函数内定义的指针的缘故了。。。
Gonefar 2012-07-19
  • 打赏
  • 举报
回复
malloc 给指针分配内存后,如果不用free的话,会一直存在于整个程序(即main函数)运行过程中。如果用完了之后不释放,就会造成这块内存无法被再利用(即所谓的内存泄露)。而main函数结束后,所有分配的内存应该都由系统回收回来,不管是静态存储区的内存还是堆或栈的空间。
wjh774221533 2012-07-19
  • 打赏
  • 举报
回复
记得要释放啊,手动的,不然会遇到一些问题的
tian31 2012-07-19
  • 打赏
  • 举报
回复
ptTail=ptTemp;//这句不起作用,无法修改实参ptTail,可以给(ptHead,ptTail)加个结构,或者用指针的指针
luckyjungle 2012-07-19
  • 打赏
  • 举报
回复
malloc是需要free的~
booirror 2012-07-18
  • 打赏
  • 举报
回复
malloc分配的空间不会自动释放,需要自己手动free掉。
AnYidan 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

malloc的节点是不会释放掉的,你需要自己手动free掉。当整个程序结束后,操作系统会回收程序的所有的资源。
[/Quote]

++
north00 2012-07-17
  • 打赏
  • 举报
回复
查了一下书,指针变量做函数形参的时候没法改变实参的地址,只能改变实参的变量值;
也就是说在add_node函数中ptTail=ptTemp;追加节点的方式不正确,因此没法传递过去!

看来只有将头节点和尾节点的指针变量定义为全局的了。。。。


[Quote=引用 5 楼 的回复:]
代码显示没有错误,应该是其他的问题吧,


C/C++ code

void node_list()
{
struct NODE *ptHead,*ptTail;

add_node(ptHead,ptTail); /*第k次追加节点*/

add_node(ptHead,ptTail); /*第k+1次追加节点*/



}

void ad……
[/Quote]
夏天__ 2012-07-17
  • 打赏
  • 举报
回复

函数最后写一个释放链表的函数,把链表全部释放掉;
free( head)
{
struct NODE *p1,*p2;
p1 = head;
while( p1 != NULL )
{
p2 = p1;
p1 = p1->next;
free(p1);
}
head = NULL;
}
夏天__ 2012-07-17
  • 打赏
  • 举报
回复
代码显示没有错误,应该是其他的问题吧,

void node_list()
{
struct NODE *ptHead,*ptTail;

add_node(ptHead,ptTail); /*第k次追加节点*/

add_node(ptHead,ptTail); /*第k+1次追加节点*/



}

void add_node(struct NODE *ptHead, struct NODE *ptTail)
{
struct NODE *ptTemp;

/* create a new node*/
ptTemp=(struct NODE *)malloc(sizeof(struct NODE));
...
...


/* add to the list */
ptTail->ptNext=ptTemp; /* ptTemp在该函数结束后是不是就释放掉了?链表中的尾节点在该函数结束后实际上指不到下个节点?*/
ptTail=ptTemp;


}
north00 2012-07-17
  • 打赏
  • 举报
回复
我上面的代码里,为什么ptTail在函数add_node里指向了下个新节点之后,返回到函数node_list里,ptTail不能正确返回值???


[Quote=引用 3 楼 的回复:]

如果做单向链表的话 你需要把最后一个节点里面的next置NULL, 如果你这个程序只是这个链表的话可以不进行手动释放 程序结束系统会自动帮你释放掉,但是如果你把链表加入到其他地方的时候 那么在程序的运行过程中就会造成内存泄漏,这是就需要你进行手动释放(在适当的地方,这个根据你自己的程序而定)。
[/Quote]
shijinpeng_2012 2012-07-17
  • 打赏
  • 举报
回复
如果做单向链表的话 你需要把最后一个节点里面的next置NULL, 如果你这个程序只是这个链表的话可以不进行手动释放 程序结束系统会自动帮你释放掉,但是如果你把链表加入到其他地方的时候 那么在程序的运行过程中就会造成内存泄漏,这是就需要你进行手动释放(在适当的地方,这个根据你自己的程序而定)。
iasky 2012-07-17
  • 打赏
  • 举报
回复
一般而言,用户态的进程结束后申请的资源可以回收,但是还是建议不使用的时候主动free
W170532934 2012-07-17
  • 打赏
  • 举报
回复
malloc的节点是不会释放掉的,你需要自己手动free掉。当整个程序结束后,操作系统会回收程序的所有的资源。

69,382

社区成员

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

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