关于链表的问题请教
#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);
}
(*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);
}