c-Malloc在adt列表程序中返回null



我正在开发一个程序,其中包含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));

相关内容

  • 没有找到相关文章

最新更新