2014-07-09 32 views
0

我目前正在C中實現一個雙向鏈表。該列表的目的是儘可能通用。這裏的節點結構:具有多態結構的錯誤內存偏移量

typedef struct list_node 
{ 
    struct list_node *prev; 
    struct list_node *next; 
    int nodeId; 
} Node; 

現在,我擴展這個到以下節點:

typedef struct history_node 
{ 
    Node *node; 
    String *cmd; 
} HistoryNode; 

凡串結構的定義如下:

typedef struct c_string 
{ 
    char *array; 
    size_t size; 
} String; 

現在,我遇到的問題是這樣的:我創建一個新的歷史節點,並將它的字符串設置爲一個值,例如「hello」。然後,我呼籲我推回功能,即定義如下:

void pushBack(Node *node, List *list) 
{ 
    node->next = list->tail; 
    node->prev = list->tail->prev; 
    list->tail->prev->next = node; 
    list->tail->prev = node; 
    list->size++; 
} 

這裏的事情是,當我分配node->next,而不是訪問歷史節點的node一部分,我訪問字符串,從而導致災害。我不知道爲什麼會發生這種情況。查看內存中的地址,傳入的指針具有正確的地址,但在node->next中訪問的地址對應於地址cmd而不是node。有任何想法嗎?

以防萬一,調用此函數的代碼是:

HistoryNode *node = createHistoryNode(buffer); 
pushBack((Node*)node, historyList); 

我已經驗證了createHistoryNode作品如預期,所以這不是問題的根源。

+0

'節點*節點;'你想從這裏取出的明星,並相應地修改節點創建。 –

+0

@nmm。謝謝!這解決了問題 – Mauricio

回答

0

你不想

typedef struct history_node { 
    Node *node; 
    String *cmd; 
} HistoryNode; 

你想

typedef struct history_node { 
    Node node; 
    String *cmd; 
} HistoryNode; 
+0

非常感謝。這解決了這個問題。 – Mauricio