Valgrind 神秘的大小为 8 的无效写入错误

Valgrind mysterious invalid write of size 8 error

我进行了广泛的搜索,没有找到答案,所以最好的选择是问我自己的问题。我目前正在为大学做作业,它要求我们构建一个具有键和值字符串的节点。

我构建了以下节点以及以下两个函数:

typedef struct node_t
{
    char *key;
    char *data;
} * Node;

Node nodeCreate()
{
    Node node = NULL;
    node = malloc(sizeof(Node));
    if (node == NULL)
        return NULL;
    node->key = NULL;
    node->data = NULL;
    return node;
}
void nodeDestroy(Node node)
{
    if (node == NULL)
        return;
    if (node->key != NULL)
        free(node->key);
    if (node->data != NULL)
        free(node->data);
    free(node);
}

但是,上面的代码给我以下错误:

现在,这是情节转折。 如果我删除数据的代码,代码可以正常工作并且 valgrind 不会出现任何问题

我找不到任何修复方法,这让我无法完成一项重大任务,而且我不知道该怎么做。 感谢任何帮助。

node = malloc(sizeof(Node));

以上将只分配必要的大小来存储指向 struct node_t 的指针,因为你如何定义 Node

要么将行更改为:

node = malloc(sizeof(*node));

或者将 Node 定义为 struct node_t 的别名而不是指向它的指针。

node = malloc(sizeof(Node));

分配的 space 只够一个指针使用。

另一方面,该结构有 2 个指针,因此通常它会大于一个指针。

该行应该是

node = malloc(sizeof(struct node_t));

node = malloc(sizeof(*node));

分配足够的space。

malloc(sizeof(Node))

您没有像预期的那样分配 node_t 而是指向它的指针

替换为

malloc(sizeof(struct node_t))

定义类型指针是个坏主意,会产生那种错误,替换

typedef struct node_t
{
    char *key;
    char *data;
} * Node;

来自

typedef struct node_t
{
    char *key;
    char *data;
} Node;

并且不要到处屏蔽指针