c - 多态结构的内存偏移错误

标签 c struct polymorphism

我目前正在用 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/

相关文章:

c++ - 函数不参与继承中的重载决策

Java-声明用户选择的类型的对象

c++ - 在用户拖动 ListView 项时检测何时需要滚动

将 char* 转换为 unsigned char*

c++ - 访问 dlopen 标志

c++ - c++ 中的 read() 函数类似于 c read()

对 map[string][]struct{} 进行排序

c - 字符集是机器相关的还是语言相关的?

vb.net - 为什么 Visual Studio 2012 不允许您在创建新的 VB.NET 文件时选择结构?结构是否已弃用?

c++ - 未调用派生类函数