【发布时间】:2015-04-10 22:52:49
【问题描述】:
我有下面的 merge_Sort() 函数,它实现了归并排序。
它确实排序正确(当我注释掉 free() 调用时),但是当我尝试释放已排序子数组占用的内存时就会出现问题。
/* merge_Sort() to merge array by didive and conquer*/
/* calls merge_v_1() to merge two sorted subarrays*/
/* merge_v_1() takes two sorted subarrays and copies them to new sorted array, and returns the pointer to this new sorted array*/
int *merge_Sort(int *array, int a, int b)
{
if (a==b)
return array;
else
{
int middle = ((a+b)/2);
int *left_Sub_Array, *right_Sub_Array;
int *left_Sub_Array_1, *right_Sub_Array_1;
left_Sub_Array = merge_Sort(array, a, middle);
right_Sub_Array = merge_Sort((array + (middle - a + 1) ), middle + 1 ,b);
left_Sub_Array_1 = left_Sub_Array;
right_Sub_Array_1 = right_Sub_Array;
int *newArray = malloc((b - a + 1) * (sizeof(int)));
if (newArray == NULL)
{
exit (1);
}
merge_v_1(left_Sub_Array_1, (middle - a + 1), right_Sub_Array_1, (b - middle), newArray);
// PROBLEM IS HERE IN BELOW TWO FREE()
free(left_Sub_Array);
free(right_Sub_Array);
return (newArray);
}
}
最初,我认为这是因为函数 merge_v_1() 正在更改指针 left_Sub_Array 和 right_Sub_Array。所以我想将left_Sub_Array和right_Sub_Array的值复制到left_Sub_Array_1和right_Sub_Array_1,然后将它们传递给merge_v_1(),这样left_Sub_Array和right_Sub_Array的值就不会改变。但是,我在释放内存时遇到问题。
下面是一个示例输出。
user $ ./a.out
*** Error in `./a.out': free(): invalid pointer: 0x0000000002272014 ***
Aborted (core dumped)
user $
看起来我正在尝试释放我不应该释放的内存,但我无法找出根本原因。任何帮助表示赞赏。
【问题讨论】:
-
为什么不创建一个与要排序的数组大小相同的新(单独)数组,并将其用作暂存空间?它节省了 malloc/free 的常量调用,节省了来回复制的时间,并且更易于理解和编程。
标签: c algorithm free mergesort