Malloc在adt list程序中返回null

时间:2014-11-08 11:04:45

标签: c list null malloc adt

我正在开发一个带有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;
}

再次感谢!

2 个答案:

答案 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)
  • 如果用户输入的时间超过35 scanf("%s" ...,则
  • scanf("%35s" ...应为char以避免缓冲区溢出。

答案 1 :(得分:0)

进行以下建议更改: 应该为sizeof结构分配内存,如下所示,而不是指向结构的指针大小。这需要在程序中的所有malloc()中更新。

   list = malloc(sizeof(struct list));

   p = malloc(sizeof(struct node));

   student = malloc(sizeof(struct student));