我使用calloc分配了指针l和r,并尝试使用free来释放指针

问题描述

这是我的代码,用于将归并作为递归函数进行归并排序,函数合并并打印以打印最终数组。我觉得问题只在于在函数合并中释放'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),因此您的代码很难阅读。