错误的内存偏移与多态结构

时间:2014-07-09 04:05:59

标签: c struct polymorphism

我目前正在C中实施双向链表。该列表的目的是尽可能通用。这是节点struct:

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;

现在,我遇到的问题是:我创建了一个新的历史节点,并将它的字符串设置为一个值,"你好"例如。然后我调用我的pushBack函数,定义如下:

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按预期工作,因此这不是问题的根源。

1 个答案:

答案 0 :(得分:0)

你不想要

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

你想要

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