C 编程 - 释放一个用单引号填充的字符 ** 和用双引号填充的字符之间的区别 - valgrind

标签 c valgrind free double-quotes single-quotes

我正在尝试用这个程序测试免费功能

  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] = "@@@@";

所以你刚刚:

  1. 丢失了 malloced 内存(您的LEAK SUMMARY 声明的内容)。
  2. 尝试free() 一个字符串文字(您的ERROR SUMMARY 指出的内容)。

如果你想正确地将"@@@@"复制到内存中,你可以使用strncpy() :

strncpy(tab[j], "@@@@", 4);

关于C 编程 - 释放一个用单引号填充的字符 ** 和用双引号填充的字符之间的区别 - valgrind,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47418810/

相关文章:

c - c中的函数头

C 编程动态数组

c - valgrind 中大小为 1 的无效写入/读取,未找到答案

c - 释放字符串数组的函数

c - C 中的字符串提取和插入函数?

c - 为什么我总是得到字符串数组的最后一个元素?

c - 多个客户端未连接且无法同时通信

c - 链表逻辑错误

c - 让 valgrind 显示常见错误

c - C链表遍历中移除条目并释放桶节点时出错