C 如何修复valgrind内存?

C 如何修复valgrind内存?,c,valgrind,C,Valgrind,所以我有一个结构,当我启动一个结构时,我使用malloc,如下所示: typedef struct node{ void *value; struct node *next; } node; typedef struct QueueADT{ int (*cmp)(const void*a, const void*b); struct node *front; int len; struct node *back; } * QueueADT;

所以我有一个结构,当我启动一个结构时,我使用malloc,如下所示:

typedef struct node{ 
    void *value;
    struct node *next;
} node;

typedef struct QueueADT{
    int (*cmp)(const void*a, const void*b);
    struct node *front;
    int len;
    struct node *back;
} * QueueADT;




QueueADT que_create( int (*cmp)(const void*a, const void*b) ) {
    printf("%lu\n",sizeof(QueueADT));
    QueueADT q = (QueueADT)malloc(sizeof(QueueADT));
    if (q == NULL) {return NULL;}
    q->cmp = cmp;
    q->len = 0;
    return q;
}
valgrind说:

Invalid write of size 4
Address 0x5204490 is 8 bytes after a block of size 8 alloc'd
写入错误属于q->len=0


我不知道问题出在哪里,是不是分配了不正确的字节数?

看起来
QueueADT
是指针类型的typedef。这意味着
sizeof(QueueADT)
的计算结果是指针的大小,而不是指针指向的内容。由于系统上的指针似乎是8个字节,并且所讨论的结构大于8个字节,因此您的写入超过了分配内存的末尾

你想要的是:

QueueADT q = malloc(sizeof(*q));
这为
q
指向的内容分配了足够的空间。也


将指针隐藏在
typedef
后面也是一种不好的做法,因为您使用的指针可能会使读者感到困惑,这可能是在这种情况下让您绊倒的原因。

看起来
QueueADT
是指针类型的typedef。这意味着
sizeof(QueueADT)
的计算结果是指针的大小,而不是指针指向的内容。由于系统上的指针似乎是8个字节,并且所讨论的结构大于8个字节,因此您的写入超过了分配内存的末尾

你想要的是:

QueueADT q = malloc(sizeof(*q));
这为
q
指向的内容分配了足够的空间。也


将指针隐藏在
typedef
后面也是一种不好的做法,因为您使用的指针可能会使读者感到困惑,这可能是您在本例中被绊倒的原因。

请提供一个示例,尤其是QueueADT.oops my bad的声明,我应该这么做的
QueueADT
的定义是什么?只是在请提供一个中添加了它,特别是QueueADT的声明。糟糕,我应该这么做的
QueueADT
的定义是什么?只是为了快速回复而添加了它!很好的假设!现在一切都好了。另外,谢谢你对typedef指针的解释,我会考虑的。谢谢你的快速回复!很好的假设!现在一切都好了。也谢谢你对typedef指针的解释,我会考虑的