C Valgrin:大小为8的写入无效错误

C Valgrin:大小为8的写入无效错误,c,malloc,valgrind,C,Malloc,Valgrind,我到处找了,没有找到答案,所以最好的选择是问我自己的问题。我目前正在为大学做一项作业,要求我们构建一个具有键和值字符串的节点 我构建了以下节点,以及以下两个功能: typedef结构节点 { 字符*键; 字符*数据; }*节点; 节点nodeCreate() { Node=NULL; node=malloc(sizeof(node)); if(node==NULL) 返回NULL; 节点->键=NULL; 节点->数据=NULL; 返回节点; } void nodeDestroy(节点节点) {

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

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

typedef结构节点
{
字符*键;
字符*数据;
}*节点;
节点nodeCreate()
{
Node=NULL;
node=malloc(sizeof(node));
if(node==NULL)
返回NULL;
节点->键=NULL;
节点->数据=NULL;
返回节点;
}
void nodeDestroy(节点节点)
{
if(node==NULL)
返回;
如果(节点->键!=NULL)
自由(节点->键);
如果(节点->数据!=NULL)
自由(节点->数据);
自由(节点);
}
但是,上面的代码给了我以下错误:

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

我找不到任何解决办法,这让我不得不承担一项重大任务,我不知道该怎么办非常感谢您的帮助

node = malloc(sizeof(Node));
由于您如何定义
节点
,上面只会分配必要的大小来存储指向
结构节点的指针

将行更改为:

node = malloc(sizeof(*node));
或者将节点定义为
struct Node\u t
的别名,而不是指向它的指针

node = malloc(sizeof(Node));
正在分配仅可容纳一个指针的空间

另一方面,该结构有两个指针,因此它通常比一个指针大

线路应该是

node = malloc(sizeof(struct node_t));

分配足够的空间。

您没有按预期分配
节点,而是分配指向该节点的指针

换成

malloc(sizeof(struct node_t))
定义一个类型指针是一个坏主意,它会产生这种错误,replace


不要到处屏蔽指针

这是因为在typedef中,Node代表指针,删除valgrind上的“*”信任并继续使用它,即使您认为某个程序已过期error@bruno我无法编辑它,我将根据提供的特定头文件进行编辑。好的,很遗憾,因为这样做是个坏主意,
sizeof(*Node)
sizeof(Node\u t)
都是无效的。@MikeCAT是的,如果这是你的意思,我错过了'struct'。是的,后半段。@MikeCAT我没有看到已经有答案了,我在写评论时没有答案,最好我删除我的答案,然后你的答案的后半部分不在其他人的答案上,因此我认为你的答案不应该被删除。@GeorgeSarji我鼓励你永远不要定义指向的指针,这是导致很多错误的原因,屏蔽指针会使代码难以阅读/理解
malloc(sizeof(Node))
malloc(sizeof(struct node_t))
typedef struct node_t
{
    char *key;
    char *data;
} * Node;
typedef struct node_t
{
    char *key;
    char *data;
} Node;