Debug的时候 return *p一步出现30xC0000005: 读取位置 0x00000000 时发生访

C语言 码拜 8年前 (2016-04-10) 689次浏览
#include<stdio.h>
#include<stdlib.h>
typedef struct List     //构建结构体
{ int coef;
int exp;
struct List *next;
}Node;
int Compare(int a,int b)      //比较指数大小
{
if(a>b)
return 1;
else {if(a=b)
return 0;
else
return -1;
}
}
void Attach(int coef,int exp,Node *Rear)   //将系数大的项连接到新链表的后面
{   Node *P;
P=(Node*)malloc(sizeof (Node));
P->coef=coef;
P->exp=exp;
Rear->next=P;
Rear=P;
}
Node Add(Node *p1,Node *p2)    //保存有多项式系数和指数的两个链表相加,返回 头指针p3(这一步出现题中所说错误)
{
Node *p3,*rear3,*temp3;
int sum=0;
rear3=(Node*)malloc(sizeof (Node));
p3=rear3;
while(p1&&p2)
{switch(Compare(p1->exp,p2->exp))
{  case 1:
Attach(p1->coef,p1->exp,rear3);
p1=p1->next;
break;
case -1:
Attach(p2->coef,p2->exp,rear3);
p2=p2->next;
break;
case 0:
sum=p1->coef+p2->coef;
if(sum!=0)
Attach(sum,p1->exp,rear3);
break;
}}
for(;p1;p1=p1->next) Attach(p1->coef,p1->exp,rear3);
for(;p2;p2=p2->next) Attach(p2->coef,p2->exp,rear3);
rear3->next=NULL;
temp3=p3;
p3=p3->next;
free(temp3);
return *p3;
}
int main()
{   int N1=0,N2=0;
int n1=0;int n2=0;
Node *p1,*p2;
Node *rear1,*rear2;
Node *temp1,*temp2;
Node *temp;
Node *p;
p1=rear1=(Node*)malloc(sizeof (Node));
rear1=NULL;
p1->next=rear1;
temp1=p1;
printf(“请输入第一个多项式的非零项数N1:”);
scanf(“%d”,&N1);
printf(“请输入每个非零项的系数和指数,以空格隔开:”);
while(n1<N1)
{  rear1=(Node*)malloc(sizeof (Node));
scanf(“%d”,&rear1->coef);
scanf(“%d”,&rear1->exp);
rear1->next=NULL;
temp1->next=rear1;
temp1=temp1->next;
n1++;
}
temp=p1;
p1=p1->next;
free(temp);
p2=rear2=(Node*)malloc(sizeof (Node));
rear2=NULL;
p2->next=rear2;
temp2=p2;
printf(“请输入第一个多项式的非零项数N2:”);
scanf(“%d”,&N2);
printf(“请输入每个非零项的系数和指数,以空格隔开:”);
while(n2<N2)
{  rear2=(Node*)malloc(sizeof (Node));
scanf(“%d”,&rear2->coef);
scanf(“%d”,&rear2->exp);
rear2->next=NULL;
temp2->next=rear2;
temp2=temp2->next;
n2++;
}
temp=p2;
p2=p2->next;
free(temp);
n1=0;
while(n1<N1)
{
printf(“%d\n”,p1->coef);
p1=p1->next;
n1++;
}
n2=0;
while(n2<N2)
{
printf(“%d\n”,p2->coef);
p2=p2->next;
n2++;
}
p=(Node*)malloc(sizeof (Node));
*p=Add(p1,p2);
printf(“两个多项式相加后的系数和指数为:”);
while(p)
{
printf(“%d %d “,p->coef,p->exp);
p=p->next;
}
return 0;
}
解决方案

80

你对NULL指针进行了操作
稍微调试了下发现Add函数要返回的时候,此时p3已经是NULL了,你还*p3就出现异常了
同时你的Compare里面也不对else {if(a=b)是什么鬼,多了个{少了个=
Windows:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
Linux:
进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件例如‘core.1234’
使用命令
gdb 运行程序名 core或core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
假如进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
代码功能归根结底不是别人帮本人看或讲解或注释出来的;而是被本人静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生本人领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Debug的时候 return *p一步出现30xC0000005: 读取位置 0x00000000 时发生访
喜欢 (0)
[1034331897@qq.com]
分享 (0)