【发布时间】:2015-07-31 03:39:49
【问题描述】:
写出这个库程序,当我通过终端运行时,我收到了 Segmentation Fault 11。起初,在调试时,它似乎位于带有结构的某个地方,但后来它给了我一些问题,我声明了我的 FILE 指针。有人能解释一下这个问题吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LENGTH 40
#define MAX_BOOKS 1000
struct book
{
char title[MAX_LENGTH];
char author[MAX_LENGTH];
char subject[MAX_LENGTH];
}*Book;
struct library
{
struct book collection[MAX_BOOKS];
int num_books;
}*lib;
int main()
{
struct library *lib;
char title[MAX_LENGTH], author[MAX_LENGTH], subject[MAX_LENGTH];
Book = NULL;
lib->num_books = 0;
int events = 0, selection = 0;
FILE *ifp;
ifp = fopen("library.txt", "r");
if (ifp == NULL)
{
printf("\nFile not found\n");
exit(0);
}
fscanf(ifp, "%d", &events);
for (int i=0;i<events; i++)
{
Book = NULL;
fscanf(ifp, "%d", &selection);
switch (selection)
{
case 1:
fgets(title, MAX_LENGTH, ifp);
fgets(author, MAX_LENGTH, ifp);
fgets(subject, MAX_LENGTH, ifp);
strcpy(Book->title, title);
strcpy(Book->author, author);
strcpy(Book->subject, subject);
lib->num_books += 1;
//addBook(lib);
break;
case 2:
lib->num_books -= 1;
//deleteBook();
break;
case 3:
//search;
break;
case 4:
break;
case 5:
break;
default:
printf("Invalid command\n");
break;
}
}
fclose(ifp);
return 0;
}
【问题讨论】:
-
lib->num_books = 0;? -
使用调试器。至少它会告诉你哪一行代码导致了段错误。如果使用得当,您很有可能通过查看 seg 故障点的变量状态来发现问题。
-
是的,'lib' 指针未初始化:(
-
使用该初始化更新您问题中的代码。否则所有的答案都将是关于那个统一化的变量。
-
@Leopold_Stotch 您更新后的代码有很多问题。 1. 全局变量初始化为零。所以你仍然不能取消引用它。 2. 你有一个同名的局部变量。局部变量将隐藏全局变量。所以你仍然在访问统一的局部变量。
标签: c segmentation-fault codeblocks