Valgrind输出理解

Jee*_*tel 1 c malloc valgrind memory-leaks

==20420== 
==20420== HEAP SUMMARY:
==20420==     in use at exit: 0 bytes in 1 blocks
==20420==   total heap usage: 1 allocs, 0 frees, 0 bytes allocated
==20420== 
==20420== Searching for pointers to 1 not-freed blocks
==20420== Checked 48,492 bytes
==20420== 
==20420== 0 bytes in 1 blocks are still reachable in loss record 1 of 1
==20420==    at 0x400677E: malloc (vg_replace_malloc.c:195)
==20420==    by 0x80483D8: main (jig.c:10)
==20420== 
==20420== LEAK SUMMARY:
==20420==    definitely lost: 0 bytes in 0 blocks
==20420==    indirectly lost: 0 bytes in 0 blocks
==20420==      possibly lost: 0 bytes in 0 blocks
==20420==    still reachable: 0 bytes in 1 blocks
==20420==         suppressed: 0 bytes in 0 blocks
Run Code Online (Sandbox Code Playgroud)

在我的项目中看到我使用malloc像这样:

malloc(sizeof(some_structure) * some_expression);
Run Code Online (Sandbox Code Playgroud)

在某一点,some_expression给出值0,所以间接我正在做

   malloc(0)
Run Code Online (Sandbox Code Playgroud)

因此,当我不打算使用malloc时,我不会释放它,但在这种情况下,valgrind会显示内存泄漏.为什么?

编辑:

如果我这样使用:

char *a = malloc(0);
Run Code Online (Sandbox Code Playgroud)

那么a不是NULL.所以问题是为什么不是NULL?&它存储哪个地址?

Fre*_*Foo 6

从我的malloc(3)联机帮助页(Linux):

如果size为0,则malloc()返回或者是NULL稍后可以成功传递给的唯一指针值free().

因此,malloc当你传递0时,并不能保证不会分配任何空间,如果不是,你必须得到free它给你的指针NULL.

如果malloc不返回NULL,则会得到一个不能用于任何事情的缓冲区,但由于它具有唯一的地址,因此malloc必须至少分配一个字节.

也许你想malloc用一个来代替这个电话

// like malloc, but guarantees NULL return value if n==0
void *malloc0(size_t n)
{
    return n ? malloc(n) : NULL;
}
Run Code Online (Sandbox Code Playgroud)