C valgrind地址是分配大小为4的块后的0字节

C valgrind地址是分配大小为4的块后的0字节,c,memory-leaks,malloc,valgrind,C,Memory Leaks,Malloc,Valgrind,我在做一个数学图书馆 创建向量创建维度n的向量:v1、v2、v3、…、vn 删除并释放内存 struct Vector { unsigned int dimension; double *components; }; typedef struct Vector *vector_t; vector_t create_vector(const unsigned int dimension) { if(!dimension) return NULL;

我在做一个数学图书馆

创建向量创建维度n的向量:v1、v2、v3、…、vn

删除并释放内存

struct Vector
{
    unsigned int dimension;
    double *components;
};
typedef struct Vector *vector_t;

vector_t create_vector(const unsigned int dimension)
{
    if(!dimension)
        return NULL;

    vector_t vector = (vector_t)malloc(sizeof(struct Vector));
    vector->dimension = dimension;
    vector->components = (double *)calloc(dimension, sizeof(double));

    return vector;
}

void delete_vector(vector_t *vector)
{
    if(*vector == NULL)
        return;

    free((*vector)->components);
    free(*vector);
    *vector = NULL;
}
主文件:

int main()
{
    vector_t vector1 = create_vector(3);
    delete_vector(&vector1);
}
在主文件中,我使用这两个函数,但valgrind给了我这些警告。没有任何内存泄漏。我怎样才能解决这个问题

==6906== Invalid write of size 4
==6906==    at 0x108800: create_vector (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==    by 0x10877E: main (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==  Address 0x4b3702c is 0 bytes after a block of size 4 alloc'd
==6906==    at 0x483021B: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==6906==    by 0x1087DC: create_vector (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==    by 0x10877E: main (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==
==6906== Invalid read of size 4
==6906==    at 0x10882B: delete_vector (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==    by 0x108790: main (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==  Address 0x4b3702c is 0 bytes after a block of size 4 alloc'd
==6906==    at 0x483021B: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==6906==    by 0x1087DC: create_vector (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==    by 0x10877E: main (in /home/mrcoder/Scrivania/GitHub/libmath/test/testvector)
==6906==
==6906==
==6906== HEAP SUMMARY:
==6906==     in use at exit: 0 bytes in 0 blocks
==6906==   total heap usage: 2 allocs, 2 frees, 28 bytes allocated
==6906==
==6906== All heap blocks were freed -- no leaks are possible
==6906==
==6906== For counts of detected and suppressed errors, rerun with: -v
==6906== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

您确定没有使用mallocsizeofvector\u t编译吗;而不是使用mallocsizeofstruct向量


大小为4 alloc’d的块表示如果您有一个32b CPU,则malloc仅为指针大小的4个字节,结构的大小至少为8个字节

如果我在valgring下编译并执行您的程序,则我没有错误/警告。请使用调试选项-g编译您的程序,以查看valgrind发出问题信号的位置,即使它可能是vector->dimension=dimension;和向量->维度=维度;不要将指针性质隐藏在typedef别名后面,例如vector_t。这样做通常会造成混乱,而不是帮助。因此,我尝试了:libvector.h头文件libvector.c库文件main.c main文件,如果我在main.c文件中声明这些函数,则没有警告。为什么?首先,我看不到include语句。确保为您正在调用的函数包含所有正确的头文件。其次,不显示libvector.h头文件。显示出来。第三,您是如何编译代码的?您应该打开所有警告。@bruno示例不完整。我学到的大多是艰苦的方式。。。不要在信息不完整的情况下猜测答案,尤其是当通过提问就可以很容易地提供完整信息时。这并不能回答问题。你打算把它写下来作为评论吗?@JohnBollinger我想这回答了这个问题,我的意思是我认为他是用mallocsizeofvector_t-如果你这么想,那么直接说就更好了。但即使如此,如果你的结论是问题中的代码没有再现问题,那么正确的回答是要么在评论中要求澄清,要么投票以不可再现的方式结束问题。@JohnBollinger正如你所看到的,我是法国人,我的英语不完美,我只是想帮助他,我担心投票结束对他没有帮助:-我做了VTC+评论。但我也认为这是我的公民义务的一部分,试图培养那些经验较少的社区公约和规范。有一个标准的结束原因完全符合这个问题,另一个也符合这个问题的,没有MCVE,应该被视为结束这些问题是适当的行为,直到和除非它们得到改进。但我不会在这里再谈这个话题了。归根结底,这也是我们文化的一部分,你可以在很大程度上随心所欲,享受你所享有的特权。