0

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

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*)’

有什么想法可能导致这种情况吗?如果我离开 free(*temp_array); 总之,程序编译并运行良好。免费(临时数组);导致段错误

4

3 回答 3

2

函数定义的以下部分不正确:

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

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

这里还有一个错误:

malloc(*size * 2 * sizeof(original_array)

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

于 2013-04-27T22:52:02.837 回答
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);

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

*Edit * 我之前提到过内存会被释放两次,但事实并非如此,因为应该在不取消引用 *temp_array 的情况下调用 free 以实现这一点。

于 2013-04-27T23:40:39.013 回答
0

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

代码已分配内存:

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

然后它应该释放内存:

    free(*temp_array);

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

于 2013-04-27T23:45:18.167 回答