匠人及各位大大进,一个关于链表的问题?

[复制链接]
2672|6
 楼主| 练就大毅力 发表于 2010-11-12 08:54 | 显示全部楼层 |阅读模式
本帖最后由 练就大毅力 于 2010-11-12 09:08 编辑
  1. //例4.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. typedef int DataType;
  5. #include "LinkList.h"

  6. int main(void)
  7. {
  8. LinkList A;
  9. InitList(&A);
  10. }

  11. //LinkList.h
  12. typedef struct Node
  13. {
  14. DataType data;
  15. struct Node *next;
  16. }ListNode,*LinkList;

  17. //单链表的初始化操作
  18. void InitList(LinkList *head)
  19. {
  20. //方法一
  21. if((*head=(LinkList)malloc(sizeof(ListNode)))==NULL)
  22. {
  23. exit(-1);
  24. }

  25. (*head)->next=NULL;

  26. //方法二
  27. /*
  28. ListNode HeadNode;
  29. (*head)=&HeadNode;
  30. (*head)->next=NULL;
  31. */
  32. }
在这个单链表的InitList的初始化函数中
书上是用malloc函数分配了一块ListNode变量,即头结点的存储单元。并且头指针(*head)指向这个存储单元。。
我想问可不可以用我里面写的方法二,即,直接用ListNode 定义一个头结点变量HeadNode,然后用取地址运算符取它的地址,将这个地址赋值给头指针(*head)??
能不能这样做??
因为,调用InitList()函数,返回主函数时,里面的变量都是局部变量,系统会收回里面的局部变量动态分配的内存。按道理,方法二 是行不通的。。但是,用malloc函数也是动态分配的内存单元,那么InitList()函数返回主函数时是否会回收该内存单元的地址呢?
 楼主| 练就大毅力 发表于 2010-11-12 09:06 | 显示全部楼层
一个子函数void InitList(LinkList *head)里定义了一个局部变量ListNode HeadNode,当调用子函数结束时,系统会回收该局部变量 HeadNode的内存单元?
这一句话怎么理解。。是否可以这样理解:
比如:一个子函数中定义了一个局部变量ListNode HeadNode;并且,这个变量HeadNode在内存单元的地址为:0xFFeAA。。子函数调用结束后,该内存单元地址被释放,即,系统可以将这个内存单元的地址分配给别的 变量。。但如果,这个内存单元的内容没有被刷新的话,它里面存放的还是被释放前的值。。
我想问的是:这里,虽然这个变量HeadNode的存储单元被系统把它回收了,但是,头指针(*head)依然是指向这个存储单元的,那么,现在还可以用这个(*head)去访问这个存储单元不,还可以进行(*head)->next=NULL;(*head)->data=5; 还可以进行这些操作不??
 楼主| 练就大毅力 发表于 2010-11-12 09:35 | 显示全部楼层
急呀、、各位大大、、叩谢了、、
highgear 发表于 2010-11-12 09:55 | 显示全部楼层
方法一可以, 但别忘了 free(A)
方法二无用而且危险, 因为 ListNode HeadNode 是栈上的临时变量, 出了initList 函数就被收回, 原数据区可能会被其他变量或数据占用覆盖, 当再此进行(*head)->next=NULL;(*head)->data=5; 可能会波坏整个程序。
刘前辈 发表于 2010-11-12 10:33 | 显示全部楼层
本帖最后由 刘前辈 于 2010-11-12 10:52 编辑
……但是,用malloc函数也是动态分配的内存单元,那么InitList()函数返回主函数时是否会回收该内存单元的地址呢?


highgear 大侠看清楚LZ的第二个问题:方法一InitList()函数返回主函数后,所分配的内存单元由于没有free( ),当然没有被回收。——再说动态分配内存的位置不在共享覆盖区,(在内存池里。)不受系统回收功能控制,无所谓“回收”,是“释放”回内存池的问题。

LZ 问的是:(*head )是否被回收?——它是形参呀。InitList( )返回后谁来指向内存池里已经分配的动态内存?

还望highgear 大侠给更深一步讲解。

highgear 发表于 2010-11-12 11:41 | 显示全部楼层
楼上老刘还是冷漠顶替的吧, 把 led 刷新弄清楚了没有?

InitList( )返回后 A 指向堆里已经分配的动态内存.
ji_dan 发表于 2010-11-12 12:10 | 显示全部楼层
还没有认真学习这个!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:我爸不是李刚、不要欺负我、

0

主题

107

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部