我正在尝试用这个程序测试免费功能
char **tab;
// allocation
tab = malloc(5 * sizeof(char*));
for(int j=0 ; j<5 ; j++)
{
tab[j] = malloc(4 * sizeof(char));
}
// FILL TAB FIRST WAY
/*
for(int j=0 ; j<5 ; j++)
{
for(int i=0 ; i<4 ; i++)
{
tab[j][i] = '@';
}
}
*/
// FILL TAB SECOND WAY
for(int j=0 ; j<5 ; j++)
{
tab[j] = "@@@@";
}
//free
for(int j=0 ; j<5 ; j++)
{
free(tab[j]);
}
free(tab);
填充制表符的第一种方法(每个字符单独)使用 valgrind 不会返回任何内存错误,而第二种方法(逐行填充制表符)会返回一些内存错误。
HEAP SUMMARY:
==447== in use at exit: 20 bytes in 5 blocks
==447== total heap usage: 6 allocs, 6 frees, 60 bytes allocated
==447==
==447== Searching for pointers to 5 not-freed blocks
==447== Checked 64,648 bytes
==447==
==447== LEAK SUMMARY:
==447== definitely lost: 20 bytes in 5 blocks
==447== indirectly lost: 0 bytes in 0 blocks
==447== possibly lost: 0 bytes in 0 blocks
==447== still reachable: 0 bytes in 0 blocks
==447== suppressed: 0 bytes in 0 blocks
==447== Rerun with --leak-check=full to see details of leaked memory
==447==
==447== ERROR SUMMARY: 5 errors from 1 contexts (suppressed: 0 from 0)
==447==
==447== 5 errors in context 1 of 1:
==447== Invalid free() / delete / delete[] / realloc()
==447== at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-
amd64-linux.so)
==447== by 0x400607: main (test_malloc.c:35)
对此有何解释?
最佳答案
对于第二种情况,您使用以下方法分配了内存:
tab[j] = malloc(4 * sizeof(char));
然后用"@@@@"
(字符串文字)的地址覆盖指针:
tab[j] = "@@@@";
所以你刚刚:
- 丢失了
malloc
ed 内存(您的LEAK SUMMARY
声明的内容)。 - 尝试
free()
一个字符串文字(您的ERROR SUMMARY
指出的内容)。
如果你想正确地将"@@@@"
复制到内存中,你可以使用strncpy()
:
strncpy(tab[j], "@@@@", 4);
关于C 编程 - 释放一个用单引号填充的字符 ** 和用双引号填充的字符之间的区别 - valgrind,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47418810/