【问题标题】:Allocating memory to a node containing a struct将内存分配给包含结构的节点
【发布时间】:2025-12-20 12:35:12
【问题描述】:

假设我有一个来自双向链表的节点

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

以及以下名为 record 的结构,其中一个名为 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;
}

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

【问题讨论】:

  • 您的问题(和代码)毫无意义。当pMem -> data 的类型是struct record* 并且newData 的类型是int 时,如何期望pMem -> data = newData 工作???
  • @barakmanos makeNode 是一个整数链表(我理解)。我不知道如何为数据为结构的链表创建 makeNode(在我的情况下为记录和歌曲长度)

标签: c struct linked-list malloc


【解决方案1】:

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

改变这个:

struct record *data;

到这里:

struct record data;

还有这个:

struct songlength *length;

到这里:

struct songlength length;

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

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

【讨论】:

    【解决方案2】:
    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)释放内存

    【讨论】:

      【解决方案3】:

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

      pMem = malloc (sizeof (Node));// It is for first structure.
      
      pMem ->data=malloc(sizeof(struct record));
      
      pMem->data->lenght=malloc(sizeof(struct songLength));
      

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

      【讨论】: