【问题标题】:Segmentation Fault 11分段错误 11
【发布时间】: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-&gt;num_books = 0; ?
  • 使用调试器。至少它会告诉你哪一行代码导致了段错误。如果使用得当,您很有可能通过查看 seg 故障点的变量状态来发现问题。
  • 是的,'lib' 指针未初始化:(
  • 使用该初始化更新您问题中的代码。否则所有的答案都将是关于那个统一化的变量。
  • @Leopold_Stotch 您更新后的代码有很多问题。 1. 全局变量初始化为零。所以你仍然不能取消引用它。 2. 你有一个同名的局部变量。局部变量将隐藏全局变量。所以你仍然在访问统一的局部变量。

标签: c segmentation-fault codeblocks


【解决方案1】:
  lib->num_books = 0;

这是造成问题。你还没有初始化lib

给它分配内存 -

lib=malloc(sizeof(struct library));

编辑

另外不要忘记free分配的内存。

【讨论】:

    【解决方案2】:

    1)错误在以下行 lib->num_books = 0;

    指针变量 lib 在没有初始化的情况下被引用。

    2) 另一个错误是,您正在为读取操作“r”打开文件,但尝试使用该文件进行写入操作。

    【讨论】:

    • 写操作到底在哪里?有点困惑,但绝对感谢所有反馈。
    猜你喜欢
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2017-06-25
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多