c - 在 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)
你们中有人知道为什么会发生这个错误吗?
解决方案
我通常会尝试减少 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);
}
}
推荐阅读
- ruby-on-rails - 检查字符串是否属于枚举作为值
- c++ - 在 Visual Studio 2015 中链接 .lib
- matlab - 将 .ods 工作表加载到 Octave 时出错
- javascript - React Native localeCompare 在 Android 上不起作用
- r - R中线性回归的引导标准误差
- java - 如何实现 Guava 缓存来存储和获取不同类型的对象?
- angular - 角 | 如何使用 ng-template 或任何方法将 ng-content/child 内容置于组件之外
- c# - 如何将带小数点的字符串转换为带小数点逗号的双精度?
- angular - Primeng - 如何在多选/下拉列表的标题中添加一个按钮?
- vb.net - 想要将文本框中的行添加到列表框中,如果它包含单词中的单词