我目前正在用 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”。然后,我调用 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
的地址,不是节点
。有什么想法吗?
为了以防万一,调用这个函数的代码是:
HistoryNode *node = createHistoryNode(buffer);
pushBack((Node*)node, historyList);
我已经验证 createHistoryNode
按预期工作,因此这不是问题的根源。
最佳答案
你不想要
typedef struct history_node {
Node *node;
String *cmd;
} HistoryNode;
你想要
typedef struct history_node {
Node node;
String *cmd;
} HistoryNode;
关于c - 多态结构的内存偏移错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24645230/