Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 分段故障11_C_Segmentation Fault_Codeblocks - Fatal编程技术网

C 分段故障11

C 分段故障11,c,segmentation-fault,codeblocks,C,Segmentation Fault,Codeblocks,写出这个库程序,当我运行终端时,我收到一个分段错误11。起初调试时,它似乎位于结构的某个地方,但后来它给了我一些问题,我在哪里声明了我的文件指针。有人能解释一下这件事吗 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LENGTH 40 #define MAX_BOOKS 1000 struct book { char title[MAX_LENGTH];

写出这个库程序,当我运行终端时,我收到一个分段错误11。起初调试时,它似乎位于结构的某个地方,但后来它给了我一些问题,我在哪里声明了我的文件指针。有人能解释一下这件事吗

#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;
}
#包括
#包括
#包括
#定义最大长度40
#定义最大图书1000册
结构体的构造
{
字符标题[最大长度];
字符作者[最大长度];
字符主题[最大长度];
}*书;
结构库
{
结构图书收藏[MAX_BOOKS];
国际图书;
}*自由基;
int main()
{
结构库*lib;
字符标题[MAX_LENGTH],作者[MAX_LENGTH],主题[MAX_LENGTH];
Book=NULL;
lib->num\u books=0;
int事件=0,选择=0;
文件*ifp;
ifp=fopen(“library.txt”,“r”);
如果(ifp==NULL)
{
printf(“\n未找到文件\n”);
出口(0);
}
fscanf(ifp、%d、&events);
用于(int i=0;ititle,标题);
strcpy(书->作者,作者);
strcpy(书籍->主题,主题);
lib->num_books+=1;
//addBook(lib);
打破
案例2:
lib->num_books-=1;
//deleteBook();
打破
案例3:
//搜索;
打破
案例4:
打破
案例5:
打破
违约:
printf(“无效命令\n”);
打破
}
}
fclose(ifp);
返回0;
}
1)错误在以下行中 lib->num\u books=0

指针变量lib在没有初始化的情况下延迟

2) 另一个错误是,您正在为读取操作“r”打开文件,但试图将该文件用于写入操作

  lib->num_books = 0;
这造成了问题。您尚未初始化
lib

分配内存给它-

lib=malloc(sizeof(struct library));
编辑
也不要忘记释放分配的内存。

lib->num\u books=0?使用调试器。至少它会告诉您是哪一行代码导致seg故障。如果使用得当,通过查看seg故障点的变量状态,很有可能发现问题。是的,“lib”指针未初始化:(用该初始化更新问题中的代码。否则所有答案都是关于统一化变量的。@Leopold_Stotch更新后的代码有太多错误。1.全局变量被初始化为零。因此您仍然无法取消引用它。2.您有一个同名的局部变量。局部变量e将隐藏全局变量。因此,您仍在访问统一化的局部变量。写入操作具体在哪里?有点困惑,但我肯定感谢所有反馈。