我正在开发一个带有ADT列表,队列等的程序......由各种.c和.h文件制作。
我正在向您展示该计划的小提取,只是为了让您更好地了解问题所在;然而,这个小程序是可编辑和可运行的。
问题是函数中的一个简单的malloc(我总是这样做!),返回NULL,或导致分段错误(例如,Visual Studio行为与CodeBlocks不同)。我正在谈论的malloc是InsertTop函数中的一个。 这是简短的代码,感谢您的帮助!
#include <stdio.h>
#include <stdlib.h>
#define M 35+1
typedef struct student* Student;
struct student
{
char name[M];
char surname[M];
char number[M];
};
typedef struct node* Node;
struct node
{
Node prev;
Student student;
Node next;
};
typedef struct list* List;
struct list
{
Node first;
Node last;
};
/* PROTOTYPES */
List Initialize(List list);
List InsertTop(List list, Student student);
Student PromptStudent(Student student);
/* MAIN */
int main()
{
/* DECLARATIONS */
List list = NULL;
Student student = NULL;
/* LIST OPERATIONS */
list=Initialize(list);
while (0==0)
{
student=PromptStudent(student);
list=InsertTop(list, student);
}
return EXIT_SUCCESS;
}
/* FUNCTIONS */
/* 1 */
List Initialize(List list)
{
list = malloc(sizeof(List));
list->first = list->last = NULL;
return list;
}
/* 2 */
List InsertTop(List list, Student student)
{
Node p;
/* THIS LINE CREATES THE ERROR! */
p = malloc(sizeof(Node));
/* New node */
p->prev = NULL;
p->next = list->first;
p->student = student;
/* Update list with new node */
if (list->first == NULL)
list->first = list->last = p;
else
{
list->first->prev = p;
list->first = p;
}
printf(" -> Done!\n");
return list;
}
/* 3 */
Student PromptStudent(Student student)
{
student = malloc(sizeof(Student));
printf("Name: "); scanf("%s", student->name);
printf("Surname: "); scanf("%s", student->surname);
printf("Number: "); scanf("%s", student->number);
return student;
}
再次感谢!
答案 0 :(得分:1)
Node
是指针类型。您希望为指针指定的类型分配尽可能多的内存。然而,这不是Node
,而是struct node
或只是p
指向的内容,即*p
。
此
p = malloc(sizeof(Node));
应
p = malloc(sizeof (struct node));
甚至更好
p = malloc(sizeof *p);
作为一般规则:不要typedef
指针,这很容易导致混淆,就像这里一样。
您的代码存在其他一些问题:
#define M 35+1
应为#define M (35+1)
。 while (0==0)
代替while (1)
。 scanf("%s" ...
,则scanf("%35s" ...
应为char
以避免缓冲区溢出。答案 1 :(得分:0)
进行以下建议更改:
应该为sizeof结构分配内存,如下所示,而不是指向结构的指针大小。这需要在程序中的所有malloc()
中更新。
list = malloc(sizeof(struct list));
p = malloc(sizeof(struct node));
student = malloc(sizeof(struct student));