打印

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

[复制链接]
1905|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
练就大毅力|  楼主 | 2010-11-12 08:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 练就大毅力 于 2010-11-12 09:08 编辑
//例4.c
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
#include "LinkList.h"

int main(void)
{
LinkList A;
InitList(&A);
}

//LinkList.h
typedef struct Node
{
DataType data;
struct Node *next;
}ListNode,*LinkList;

//单链表的初始化操作
void InitList(LinkList *head)
{
//方法一
if((*head=(LinkList)malloc(sizeof(ListNode)))==NULL)
{
exit(-1);
}

(*head)->next=NULL;

//方法二
/*
ListNode HeadNode;
(*head)=&HeadNode;
(*head)->next=NULL;
*/
}
在这个单链表的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; 可能会波坏整个程序。

使用特权

评论回复
5
刘前辈| | 2010-11-12 10:33 | 只看该作者
本帖最后由 刘前辈 于 2010-11-12 10:52 编辑
……但是,用malloc函数也是动态分配的内存单元,那么InitList()函数返回主函数时是否会回收该内存单元的地址呢?


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

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

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

使用特权

评论回复
6
highgear| | 2010-11-12 11:41 | 只看该作者
楼上老刘还是冷漠顶替的吧, 把 led 刷新弄清楚了没有?

InitList( )返回后 A 指向堆里已经分配的动态内存.

使用特权

评论回复
7
ji_dan| | 2010-11-12 12:10 | 只看该作者
还没有认真学习这个!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

0

主题

107

帖子

0

粉丝