释放malloc的结构数组时出错

时间:2013-04-27 22:48:03

标签: c struct malloc free

我遇到了释放临时数组结构的问题,这些结构用于将另一个数组的大小加倍。我似乎没有任何问题解放原始阵列。

void foo(StruName **structName,i nt *size)
{ 
...
 StruName *temp_array = (StruName*) malloc(*size * 2 * sizeof(StruName));
 for (i = 0; i < *size; i++)
   temp_array[i] = (*original_array)[i];
 free(*original_array);
 *original_array = temp_array;
 free(*temp_array);

使用g ++ -Wall

我收到以下错误
error: cannot convert ‘StruName’ to ‘void*’ for argument ‘1’ to ‘void free(void*)’

任何可能导致这种情况的想法?如果我离开免费(* temp_array);总而言之,该程序编译并运行良好。自由(temp_array);导致段错误

3 个答案:

答案 0 :(得分:2)

功能定义的以下部分不正确:

void foo(Struct **structName, int count, int *size)

您是否已将结构声明为structName?如果是,您还需要在定义中提及参数,而不仅仅是其类型。即使structName是您的结构,您也应该编写struct structName**而不是Struct **structName 。(Struct与C中的struct不同

还有一个错误:

malloc(*size * 2 * sizeof(original_array)

您应该将*size括在大括号内,因为不清楚您是要取消引用size还是取消引用size*2*sizeof(original_array)

答案 1 :(得分:1)

original_array是指向指针的指针是什么原因?

无论如何,在我看来,您不应该释放temp数组,因为您的代码段似乎意味着您正在用它替换*original_array。如果是这样,那么你就是 与释放的记忆一起工作;这可能会运行一段时间,但最终您可能会发现您的数组值被覆盖,因为释放的内存被重新分配给其他内容。

// here *original_array will be pointing to the new `malloc`ed memory
*original_array = temp_array;

// After this line, *original_array is left dangling to the recently freed memory

free(*temp_array);

我会删除最后一条免费线。

*编辑* 我之前提到内存将被释放两次,情况并非如此,因为在没有解除引用* temp_array的情况下应该调用free以使其成为真。

答案 2 :(得分:0)

内存使用的基本原则是释放你分配的东西。如果您释放了未分配的内容,则可能会导致段错误。

代码已使用以下内容分配内存:

    StruName *temp_array = (StruName*) malloc(*size * 2 * sizeof(StruName));

然后它应该释放内存:

    free(*temp_array);

确保两个参数的内容都正确。