问题描述
这是我的代码,用于将归并作为递归函数进行归并排序,函数合并并打印以打印最终数组。我觉得问题只在于在函数合并中释放'r',但我找不到发生这种情况的原因。
include<stdio.h>
#include<stdlib.h>
#include<limits.h>
void merge(int *arr,int low,int mid,int high)
{
int n1 = mid-low+1,n2 = high-mid,*l,*r;
l= (int*)calloc((n1+1),sizeof(int));
r= (int*)calloc((n2+1),sizeof(int));
for(int i=0; i<n1; i++)
*(l+i)= *(arr+low+i);
for(int j=0; j<n2; j++)
*(r+j) = *(arr+mid+1+j);
*(l+n1)=INT_MAX;
*(r+n2)=INT_MAX;
int i=0,j=0,k=low;
while(k<high)
{
if(*(l+i)<*(r+j))
*(arr+ k++) = *(l+ i++);
else
*(arr+ k++) = *(r+ j++);
}
free(l);
free(r);
}
void merge_sort(int* a,int high)
{
if(low<high)
{
int mid= (high+low)/2;
merge_sort(a,low,mid);
merge_sort(a,mid+1,high);
merge(a,high,mid,low);
}
}
void print_array(int *arr,int n)
{
for(int i=0; i<n; i++)
printf("%d ",*(arr+i));
}
void main()
{
int *ar,n,cmp;
scanf("%d",&n);
ar = (int*)malloc(n*sizeof(int));
for(int i=0; i<n; i++)
scanf("%d",ar+i);
merge_sort(ar,n-1);
print_array(ar,n);
}
这是我的错误。
double free or corruption (out)
Aborted (core dumped)
解决方法
merge(a,high,mid,low);
应该是
merge(a,low,high);
否则,您以负值调用calloc
(这就是为什么中止-核心转储)
正如@FredLarson在评论中指出的那样,使用数组下标表示法arr[x]
而不是*(arr + x)
,因此您的代码很难阅读。