我的代码功能如下:
void** array;
array = malloc(8*sizeof(void*));
如果我把三个元素放入数组并尝试:
int i = 0;
for(i; i < 8; i++)
free(array[i]);
循环6次迭代后失败。但是如果我填充整个数组(有8个元素),for循环执行就好了。我已经尝试了18次,并且循环在9次迭代后失败,但是如果我填充整个事情它会执行得很好。
有人可以解释一下这里发生了什么吗?
答案 0 :(得分:3)
malloc
返回的内存未初始化;它可能包含垃圾数据。您正在分配指针数组,但其初始内容不是有效指针。您将某些项目设置为(可能是)有效指针,但其他人未初始化,然后在所有项目上调用free
- 甚至是未初始化的垃圾。
您需要:
free
,或NULL
。这使free
所有人都安全,因为free(NULL)
有效(并且什么都不做)。答案 1 :(得分:0)
为指针指向指针的内存分配并分配给指针,以便为内部指针分配更多内存来保存实际数据,即{{1} }被分配了int**
的内存,以便int*
可以分配给分配的int
:
int*
然后你要这样做以释放内存
// array is a double pointer variable
void **array = malloc(8 * sizeof *array); // (1) allocate memory for 8 void* pointers
for (int i = 0; i < 8; ++i)
array[i] = malloc(sizeof(int));
// (2) - malloc for the actual data to be pointed by the above allocated pointers
您必须将每个for (int i = 0; i < 8; ++i)
free(array[i]); // undo (2)
free(array); // undo (1)
与malloc
相匹配。由于您只完成了1,因此您只应撤消1。