在C中取消分配2D数组(检查指针是否为空)
我目前正试图用C编写2D数组,但valgrind有一个错误在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
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);
}
}