繁体   English   中英

将链表放入结构中的C中(分段错误)

[英]Putting Linked List inside structure in C (segmentation fault)

我的任务是制作类似于C中的酒店预订程序的东西。基本上,我应该有2个结构,一个用于预订酒店的房间(其中包含有关该房间的信息,例如其ID,楼层,有多少张床位以及诸如此类的东西,指向保留房间的人的指针和将要在那个房间的人的列表 ,以及人的其他结构(例如,包含人的名字和姓氏)。

我遇到的问题是我遇到的分段错误,因为我可能没有正确构造这些结构。

这是我的代码的一部分,应该在列表中添加一个嘉宾(位于预订结构中):

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <time.h>

#define MAXSTR 25
#define FORMAT_LEN 15

typedef struct person //structure that holds info about person
{
    char name[MAXSTR + 1];
    char surname[MAXSTR + 1];
}Guest;

typedef struct persons // list of persons
{
    Guest person;
    struct persons* next;
} Persons;

typedef struct //Pointer to first person in list
{
    Persons* list;
} List;

typedef struct room //structure that holds info about rooms that are reserved
{
    unsigned int ID;
    unsigned int floor;
    unsigned int bedcount;
    struct tm dateArrival;
    struct tm dateDep;
    bool cancelled;
    unsigned int price;
    Guest* person;
    List* list;
}Reservation;

typedef struct rooms
{
    Reservation room;
    struct rooms* next;
} Reservations;

bool PutGuestInsideList(List* list);
char* EnterString(char* str);

int main()
{
    Reservations* room = NULL;
    List list = { NULL };

    printf("New guest: \n");
    if(PutGuestInsideList(room->room.list) == false)
        printf("Try again. \n");


}

bool PutGuestInsideList(List* list)
{
    if(list == NULL)
        return false;

    Persons* newpers = (Persons*) malloc(sizeof(Persons));
    if(newpers == NULL)
        return false;

    printf("Name: ");
    EnterString(newpers->person.name);
    printf("Surname: ");
    EnterString(newpers->person.surname);

    list->list = newpers;
    return true;
}
char* EnterString(char* str)
{
    if (str == NULL)
        return str;

    char format[FORMAT_LEN] = "";
    sprintf(format, "%%%u[^\n]", MAXSTR);

    scanf(format, str);

    scanf("%*[^\n]");
    scanf("%*c");

    return str;
}

如果我在解释中遗漏了一些内容,请在评论中问我。 谢谢!

你提领room是在该行NULL if(PutGuestInsideList(room->room.list) == false) 您不能取消引用NULL指针。 room指针应在您的主要功能中正确设置。

main

    int main()
    {
    Reservations* room = NULL;//here you initialise pointer with NULL
    List list = { NULL };

    printf("New guest: \n");
    if(PutGuestInsideList(room->room.list) == false)// and here you try to access it
        printf("Try again. \n");


}

if语句中,即使roomNULLroom.list访问指针room room.list成员。

顺便说一句:使用(或学习使用)调试器,您将能够更快地调试程序。(这就是为什么它们被称为调试器)

我认为您需要花一些时间在Google上查找有关C语言中的指针的教程。正如其他人所指出的那样,room设置为null,但是您取消引用了它。

Reservations* room = NULL;
// and then
if(PutGuestInsideList(room->room.list) == false)

您还需要查看以下几行:

EnterString(newpers->person.name);
EnterString(newpers->person.surname);

person.nameperson.name都没有被写入的缓冲区。它们是不指向任何地方的指针,但是您尝试使用它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM