首页 > 解决方案 > 在 C 中释放二维数组(检查指针是否为 NULL)

问题描述

我目前正在尝试用 C 编写我的 2D-Array,但 valgrind 出现了一个错误。

void free_2d_array(vocal **array)
{
  vocal *temp = array[0];
  int i = 0;

  while (array[i])
  {
    free(array[i++]);
  }

  if (array)
  {
    free(array);
  }
}

vocal **Set_2D_Array()
{
  vocal **temp_array = (vocal **)malloc(MALLOC_BUFFER * sizeof(vocal *));

  for (int i = 0; i < MALLOC_BUFFER; i++)
    temp_array[i] = NULL;

  for (int i = 0; i < MALLOC_BUFFER; i++)
  {
    temp_array[i] = (vocal *)malloc(MALLOC_BUFFER * sizeof(vocal));
    temp_array[i][0] = '\0';
  }

  return temp_array;
}

void Read_file(char *Path)
{
  vocal **coval_first_element = Set_2D_Array();

  for (int i = 0; i < 10; i++)
   insert(&coval_first_element[i], "Test");
  print_array(coval_first_element);
  free_2d_array(coval_first_element);
}

这是我释放分配内存的代码。而且我不知道为什么我会收到这个 valgrind 错误。

==5470== Invalid read of size 8
==5470==    at 0x1088C7: free_2d_array (in /home/xanixx/Uni/ESP/A4/vocal)
==5470==    by 0x108721: Read_file (in /home/xanixx/Uni/ESP/A4/vocal)
==5470==    by 0x1086F4: main (in /home/xanixx/Uni/ESP/A4/vocal)
==5470==  Address 0x522d090 is 0 bytes after a block of size 80 alloc'd
==5470==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5470==    by 0x108737: Set_2D_Array (in /home/xanixx/Uni/ESP/A4/vocal)
==5470==    by 0x108711: Read_file (in /home/xanixx/Uni/ESP/A4/vocal)
==5470==    by 0x1086F4: main (in /home/xanixx/Uni/ESP/A4/vocal)

你们中有人知道为什么会发生这个错误吗?

标签: cmultidimensional-arrayvalgrind

解决方案


我通常会尝试减少 malloc 的数量。两个就够了。

void **myalloc(size_t sizex, size_t sizey, size_t elemsize)
{
    unsigned char **arr = NULL;

    if(sizey && sizex && elemsize)
    {
        arr = malloc(sizey * sizeof(void *));
        if(arr)
        {
            arr[0] = malloc(sizey * sizex * elemsize);
            if(arr[0])
            {
                for(size_t index = 1; index < sizey; index++)
                {
                    arr[index] = arr[0] + index * sizex *elemsize;
                }
                else
                {
                    free(arr);
                    arr = NULL;
                }
            }
        }
    }
    return arr;
}

void myfree(void **arr)
{
    if(arr)
    {
        if(*arr) free(*arr)
        free(arr);
    }
}

推荐阅读