Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中取消分配2D数组(检查指针是否为空)_C_Multidimensional Array_Valgrind - Fatal编程技术网

在C中取消分配2D数组(检查指针是否为空)

在C中取消分配2D数组(检查指针是否为空),c,multidimensional-array,valgrind,C,Multidimensional Array,Valgrind,我目前正试图用C编写2D数组,但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 = (voca

我目前正试图用C编写2D数组,但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);
}

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

我通常会减少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);
    }
}
void**myalloc(大小大小、大小、大小)
{
无符号字符**arr=NULL;
如果(sizey&&sizex&&elemsize)
{
arr=malloc(sizey*sizeof(void*);
如果(arr)
{
arr[0]=malloc(sizey*sizex*elemsize);
if(arr[0])
{
对于(大小索引=1;索引
这不是二维阵列。请参阅。您确定没有覆盖
insert(&coval_first_元素[i],“Test”)中分配的指针吗
?@XaniXxable:您应该使用
-g
选项编译代码(如果您使用
gcc
),它将为您提供发生错误的行的编号。此外,您应该使用GDB并将其与valgrind链接,您将能够看到发生错误的
i
的哪个值(可能是
MALLOC8BUFFER
,正如用户312023所指出的那样)。如果重写代码以使用实际的2D数组,一个malloc和一个free就足够了。@Lundin是的,但我遵循这里使用的问题和类型
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);
    }
}