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

问题描述 投票:0回答:3

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

我构造了以下节点以及以下两个功能:

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 error message

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

我找不到针对此问题的任何修复程序,这使我无法完成一项繁重的任务,而且我不知道该怎么办。 任何帮助表示赞赏。

c malloc valgrind
3个回答
3
投票
node = malloc(sizeof(Node));

正在分配仅用于一个指针的空间。

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

该行应该是

node = malloc(sizeof(struct node_t));

node = malloc(sizeof(*node));

分配足够的空间。


1
投票
node = malloc(sizeof(Node));

由于定义struct node_t的方式,以上内容仅分配必要的大小来存储指向Node的指针。

将行更改为:

node = malloc(sizeof(*node));

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


0
投票

in

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;

并且不要在所有地方屏蔽指针

© www.soinside.com 2019 - 2024. All rights reserved.