在线请求代码分析

arkor 2010-12-27 03:34:06
代码中的错误分析
正确的代码如下:
#include <stdio.h>
#include <stdlib.h>

typedef struct list
{
int data;
struct list *next;
};
typedef struct list *link;
typedef struct list node;

link creat(int n)
{
int i,x;
link head,p,s;
head=(node*)malloc(sizeof(node));
if(head==NULL)
{
printf("空子集");
exit(0);
}
p=head;
for(i=0;i<n;i++)
{
s=(node*)malloc(sizeof(node));
printf("请输入一个值:");
scanf("%d",&x);
s->data=x;
p->next=s;
p=s;
}
s->next=NULL;
return head;
}

void output(link head)
{
link pt;
pt=head->next;
while(pt)
{
printf("%5d",pt->data);
pt=pt->next;
}
}
int main(void) {
link head;
head=creat(4);
output(head);
}



当我在output()函数里加入一条语句:head=(node*)malloc(sizeof(node))。
它就编译不出来,请问这是什么原因啊,能否解释一下,谢谢。
...全文
127 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
arkor 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 justlovetao 的回复:]
如果你的head=(node*)malloc(sizeof(node))。语句加在pt=head->next;后面那是可以的,因为你从新申请了一个空间,它的地址和你在create()函数中申请的空间是不一样的,所以你就用另外一个新申请的地址的值赋给了pt,你说此时pt还是指向你在create()里德head 吗? 理解了吗?
[/Quote]
基本上都可以理解
  • 打赏
  • 举报
回复
你在output里面重新给head分配内存,只会影响到传过来的head形参变量!
并不能实际影响到主调函数中的head实体!!

注意分清楚参数的值拷贝问题!!
欣客 2010-12-27
  • 打赏
  • 举报
回复
int main(void) {
link head;
head=creat(4);
output(head);
}

output(head) 中的head 和 link head 是一个。head 已经在create(4)中已经创建了。
你又在ouput()中又分配了次空间,等于是把已经创建的head重新赋值了,当然是有问题了。
yuppy 2010-12-27
  • 打赏
  • 举报
回复
head是形参.. 不用你在分配内存了..
justlovetao 2010-12-27
  • 打赏
  • 举报
回复
如果你的head=(node*)malloc(sizeof(node))。语句加在pt=head->next;后面那是可以的,因为你从新申请了一个空间,它的地址和你在create()函数中申请的空间是不一样的,所以你就用另外一个新申请的地址的值赋给了pt,你说此时pt还是指向你在create()里德head 吗? 理解了吗?
就想叫yoko 2010-12-27
  • 打赏
  • 举报
回复
因为你的head是在creat()函数里面声明的
output()函数里看不到head

69,336

社区成员

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

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