将内存分配给包含结构的节点

时间:2015-02-07 11:17:35

标签: c struct linked-list malloc

所以说我有一个来自双向链表的节点

typedef struct node
{
struct node *pPrev;
struct node *pNext;
struct record *data;
}Node;

以及以下struct命名记录,其中包含一个名为songlength的结构

typedef struct record
{
    char *artist;
    char *album;
    char *song;
    char *genre;
    struct songlength *length;
    int played;
    int rating;

}Record;

typedef struct songlength
{
    int mins;
    int secs;
}SongLength;

我将如何为这样的事情分配内存。我知道如何为列表的每个节点中的单个int做一个简单的malloc / make节点。

 Node *makeNode (int newData)
{
    Node *pMem = NULL;

    pMem = (Node *) malloc (sizeof (Node));

    pMem -> data = newData;
    pMem -> pNext = NULL;

    return pMem;
}

在目前状态下,我不知道该怎么做。因为我的所有尝试都会导致混乱记忆的混乱。

3 个答案:

答案 0 :(得分:1)

不要投射malloc()和家人的结果。

pMem = malloc (sizeof (Node));// It is for first structure.

pMem ->data=malloc(sizeof(struct record));

pMem->data->lenght=malloc(sizeof(struct songLength));

您为pMem分配了内存的第一个分配。因此,数据是一个结构,因此必须为其分配内存以访问该结构成员。

答案 1 :(得分:1)

不要试图正确调用malloc,而是更改结构的定义。

改变这个:

struct record *data;

对此:

struct record data;

而且:

struct songlength *length;

对此:

struct songlength length;

由于这些结构不被用作链表的实际节点,因此似乎没有任何合理的理由来动态分配它们(除非你打算让一些Node没有{{1 }}或某些record没有record)。

当您在运行时知道所需数据的确切数量时,动态内存分配非常有用(您不必动态分配“那里的每个结构”)。

答案 2 :(得分:0)

Node *p = malloc(sizeof(NODE));

p->data = malloc(sizeof(struct record));
// Allocate memory to the pointers within this structure
p->data->artist = malloc(30);
p->data->length = malloc(sizeof(struct songLength));

为每个结构成员填写相应的值。由于你有char*作为你的结构成员,请确保在存储一些值之前为它们分配内存。

除了内存分配,请确保在成员中填写正确的值,因为我看到newdata的类型为int,它应该用于填充int类型的成员,因为你不是这样做可以确保你解决它。

使用内存后,请使用free(pointer)

释放内存