读书人

关于链表的有关问题请问

发布时间: 2012-12-30 10:43:15 作者: rapoo

关于链表的问题请教
#include <stdio.h>
#include <malloc.h>
typedef struct node
{
int data;
struct node *next;
}node,*link_list;

void init_link(node *l)
{
l=(node *)malloc(sizeof(node));
l->data = 1;
l->next = NULL;
}

void main()
{
node *p;
init_link(p);
printf("%d",p->data);
}
这个时候程序报错。将代码改为如下则可以成功:
void init_link(link_list *l)
{
*l=(node *)malloc(sizeof(node));
(*l)->data = 1;
(*l)->next = NULL;
}
void main()
{
link_list p;
init_link(&p);
printf("%d",p->data);
}

改成如下代码也同样失败:
void init_link(link_list l)
{
l=(link_list)malloc(sizeof(node));
l->data = 1;
l->next = NULL;
}
void main()
{
link_list p;
init_link(p);
printf("%d",p->data);
}

请大家帮看下之前的程序出错的原因是啥



[解决办法]
你的程序改变的是地址指向的内容,所以必须用指针的指针,否则只是在该函数中改变,主函数内不发生改变!
[解决办法]


#include <stdio.h>
#include <malloc.h>
typedef struct node
{
int data;
struct node *next;
}node,*link_list;

node * init_link()
{
l=(node *)malloc(sizeof(node));
l->data = 1;
l->next = NULL;
return l;
}

void main()
{
node *p;
p = init_link();
printf("%d",p->data);
}

[解决办法]
void init_link(node *l)
{
l=(node *)malloc(sizeof(node));
l->data = 1;
l->next = NULL;
}

void main()
{
node *p;
init_link(p);
printf("%d",p->data);
}

关于以上代码为什么会报错,其实函数调用init_link(p)仅仅只是一个值传递,意思就是说仅仅是将指针变理p的值传递给了临时变量l,(注意函数的形参,其实在调用时,他是以一个临时变量来保有他占用的内存,当函调用的时候即函数地址进入系统调用栈时,会初始化函数的形式参数,当函数返回时,即函数调用退栈时这些临时表量占用的内存会被回收,有这个概念很重要)即如果p未被初始化的号,那么p的值,是一个未知地址,这时l也被初始化为一个未知地址,如果p被初始化为NULL这时l也被初始化为NULL;
然后当函数 void init_link(node *l)实现一个申一个内存单元后,将其赋给了l(注意l只是函数初始化时定义的一个临时变量,他只是代表main()函数中变量p的值,仅仅是p的一拷贝,而不代表p自已本身),init_link()函数执行完了后,当其返回时,即函数调用退栈时,l被系统析构,占用的内存被系统回收。注意系统析构回收了p的一拷贝,这对p本身没有任何影响;
回到void main()函数的 printf("%d",p->data); p还是原来的p,p由于没被初始化,更没有得到l的值,这条执行结果就直接是内存访问异常;

[解决办法]
void init_link(link_list *l)
{
*l=(node *)malloc(sizeof(node));
(*l)->data = 1;
(*l)->next = NULL;
}

void main()
{
link_list p;
init_link(&p);
printf("%d",p->data);
}

首先需要说明一下,其实上面的代码仍然有错,是无法能过编译的,
应该这样定义:
void init_link(link_list **l)
{
*l=(node *)malloc(sizeof(node));
(*l)->data = 1;


(*l)->next = NULL;
}

void main()
{
link_list *p;
init_link(&p);
printf("%d",p->data);
}

或者:
void init_link(link_list *l)
{
/* *l=(node *)malloc(sizeof(node));
(*l)->data = 1;
(*l)->next = NULL;
*/
l->data=1;
l->next=NULL;
}

void main()
{
link_list *p;
init_link(&p);
printf("%d",p->data);
}
[解决办法]
(1)未改前p是一个野指针,指向一个未知地址
传参给I,I此时也指向这个未知地址
然后malloc了,I又指向了一个新的地址
但此时p还是指向原来的未知地址,所以会出错

(2)最好改成指针的指针,malloc后,p和*I指向同一块地址,
malloc空间,在函数结束后不会被释放(函数栈,malloc堆)

(3)这是传值不是传地址,其次malloc后,p和I是不同的内存单元

[解决办法]
#include <stdio.h>
#include <malloc.h>
typedef struct node
{
int data;
struct node *next;
}node,*link_list;

link_list init_link()
{
l=(node *)malloc(sizeof(node));
l->data = 1;
l->next = NULL;
return node;
}

void main()
{
node *p = init_link();
printf("%d",p->data);
}

读书人网 >C语言

热点推荐