[英]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
语句中,即使room
为NULL
您room.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.name
和person.name
都没有被写入的缓冲区。它们是不指向任何地方的指针,但是您尝试使用它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.