2015-02-07 110 views
1

所以說,我有一個雙向鏈表分配內存以包含結構

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

一個節點一個節點內的命名與結構如下命名記錄結構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; 
} 

在目前的狀態,我不知道如何做到這一點。因爲我所有的嘗試都會導致混亂的記憶。

+1

你的問題(和代碼)沒有任何意義。當'pMem - > data'的類型是'struct record *'並且'newData'的類型是'int'時,如何期望'pMem - > data = newData'工作? – 2015-02-07 11:22:05

+0

@barakmanos makeNode是一個整數的鏈表(我不瞭解)。我不知道如何爲鏈接列表創建一個makeNode,這個鏈接列表的數據是一個結構體(在我的例子中是record和songlength) – user3482104 2015-02-07 21:01:23

回答

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)

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) 。

只有在運行期間知道所需數據的確切數量(您不必動態分配「所有結構」)時,動態內存分配纔有用。