首页 文章

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

提问于
浏览
1

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

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

和以下结构命名记录,在该命名的songlength中有一个struct

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 回答

  • 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

    而不是尝试正确调用 malloc ,而是更改结构的定义 .

    改变这个:

    struct record *data;
    

    对此:

    struct record data;
    

    还有这个:

    struct songlength *length;
    

    对此:

    struct songlength length;
    

    由于这些结构不用作链表的实际节点,因此似乎没有任何合理的理由来动态分配它们(除非您打算在没有 record 的情况下使用某些 Node ,或者在没有 songlength 的情况下使用某些 record ) .

    当您知道所需数据的确切数量时,动态内存分配非常有用(您不必动态分配"every structure out there") .

  • 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) 释放内存

相关问题