gpt4 book ai didi

c - 在 C 中释放二维数组(检查指针是否为 NULL)

转载 作者:行者123 更新时间:2023-11-30 19:25:25 26 4
gpt4 key购买 nike

我目前正在尝试用 C 语言编写二维数组,但 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)

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

最佳答案

我通常会尝试减少 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);
}
}

关于c - 在 C 中释放二维数组(检查指针是否为 NULL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58854387/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com