qq_34679663
巧乐兹zzz
2017-06-21 15:30

C语言单步调试中cannot access memory at address...

  • c++
  • c
  • access
  • 调试

#include
#include
#include

typedef struct books
{
long ISBN; //图书ISBN
float BPrice; //图书定价
char BNumber[10]; //图书索引号 规定索引号为首位大写字母,后三位数字“F390”
char *BName; //图书名字
char *IsBorrow; //图书借阅状态
struct books *next;
}MyBooks;

//初始化
void BooksInitiate(MyBooks **head)
{
head=(MyBooks *)malloc(sizeof(MyBooks));
(*head)->next=NULL;
(*head)->ISBN=0; /
两个结构体变量在进行赋值时,不能直接通过变量名赋值,必须通过元素赋值 */
(*head)->BPrice=0;
(*head)->BNumber[10]=0;
(*head)->BName=" ";
(*head)->IsBorrow=" ";
}
//根据输入位置插入图书
int BooksInsert(MyBooks *head)
{
MyBooks *p,*q;
struct books bk;
int j,i;
p=head;
j=-1;

printf("请输入插入图书的位置:");        scanf("%d",&i);     //输入图书的存储位置 
printf("请输入图书的信息:\n");
printf("***************************\n");
printf("书名:");        scanf("%s",&bk.BName); 
printf("\n"); 
printf("ISBN:");      scanf("%d",&bk.ISBN); 
printf("\n");                  
printf("定价:");        scanf("%f",&bk.BPrice);  
printf("\n");                   
printf("索引号:");     scanf("%s",&bk.BNumber[10]); 
printf("\n");                
printf("借阅状态:");      scanf("%s",&bk.IsBorrow); 
printf("****************************\n"); 

while(p->next!=NULL&&j<i-1)
{
    p=p->next;
    j++;
}
if(j!=i-1)
{
    printf("插入元素位置参数错误!");
    return 0;
} else {   
    q=(MyBooks *)malloc(sizeof(MyBooks));
    q->ISBN=bk.ISBN;
    q->BPrice=bk.BPrice;
    q->BNumber[10]=bk.BNumber[10];
    q->BName=bk.BName;
    q->IsBorrow=bk.IsBorrow;

    q->next=p->next;
    p->next=q;      
    printf("插入成功!\n");
    return 1;                          //遇到return则结束程序 
}

}

//根据书名查找图书
int BooksGet(MyBooks head)
{
MyBooks *p;
char *name;
name = (char
)malloc(sizeof(char) * 100); //字符指针必须申请空间才能存储

p=head;
//输入查找图书的名字
printf("请输入查询图书的名字:") ;
scanf("%s",name);
while(p->next!=NULL&&strcmp(p->BName,name)!=0)    //在进行结构体内元素比较时,结构体内的元素必须初始化 
{
    p=p->next;
}
if(strcmp(p->BName,name)==0)
{   
    //输出该图书信息
    printf("书名:%s\n",p->BName);
    printf("ISBN:%d\n",p->ISBN);
    printf("定价:%f\n",p->BPrice);                   
    printf("索引号:%s\n",p->BNumber[10]);                
    printf("借阅状态:%s\n",p->IsBorrow);       
    return 1;
} else {
    printf("对不起,无此书信息!\n");
}

}
//主函数
int main()
{
MyBooks *head;
BooksInitiate(&head);
BooksInsert(head);
BooksGet(head);

}
求大神们,帮忙看看,我用的是Dev c++,编译器并没有报错,主要问题在BooksGet()函数里,我单步调试的时候,第一次走到while(p->next!=NULL&&strcmp(p->BName,name)!=0),p->BName是我的初始值(一个空字符串),第二次走到p->BName的时候,是我存入的那个值(也就是“亲爱的生活”),这时候把鼠标放在p->BName上时,才显示cannot access memory ataddress 0x .......了。如果 强行下一步,就会弹出错误 Program receive signal SIGSEGV,Segmentation fault。
![图片说明](https://img-ask.csdn.net/upload/201706/21/1498058895_781850.png)图片说明

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

2条回答

为你推荐

换一换