我正在开发一个程序,其中包含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;
}
再次感谢!
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 (1)
代替while (0==0)
- 如果用户输入超过35个
char
秒,则scanf("%s" ...
应为scanf("%35s" ...
,以避免缓冲区溢出
进行以下建议更改:内存应该按如下所示的结构的大小分配,而不是按指向结构的指针的大小分配。这需要在程序中的所有malloc()
中进行更新。
list = malloc(sizeof(struct list));
p = malloc(sizeof(struct node));
student = malloc(sizeof(struct student));