c - malloc:已释放对象的校验和不正确

标签 c recursion malloc mergesort

下面是进行合并排序的函数。但我执行时遇到错误。每次merge函数中分配的内存(aux)都被释放了,为什么释放后会被修改呢?

a.out(65287,0x1112bedc0) malloc: Incorrect checksum for freed object
0x7ff9a4c05888: probably modified after being freed. Corrupt value:
0xb00000003 a.out(65287,0x1112bedc0) malloc: *** set a breakpoint in
malloc_error_break to debug Abort trap: 6
void merge(int arr[], int lo, int mid, int hi) {
    int i = lo; 
    int j = mid + 1;
    int *aux = (int *)malloc((hi - lo + 1) * sizeof(int));
    for (int k = lo; k <= hi; k++) {
        aux[k] = arr[k];
    }   
    for (int k = lo; k <= hi; k++) {
        if (i > mid)
            arr[k] = aux[j++];
        else if (j > hi)
            arr[k] = aux[i++];
        else if (aux[i] > aux[j])
            arr[k] = aux[j++];
        else
            arr[k] = aux[i++];
    } 
    free(aux);
}

void mergesort1(int arr[], int lo, int hi) {
    if (lo >= hi)
        return;
    int mid = lo + (hi - lo) / 2;
    mergesort1(arr, lo, mid);
    mergesort1(arr, mid + 1, hi);
    merge(arr, lo, mid, hi);
}

调用方式:

mergesort1(arr, 0, 9);

最佳答案

malloc((hi - lo + 1) * sizeof(int))为索引从 0 到 hi-lo 的元素分配空间,但是for (int k = lo; k <= hi; k++) … aux[k] = …访问索引来自 lo 的元素至hi ,从而在分配的内存之外写入。

关于c - malloc:已释放对象的校验和不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63536905/

相关文章:

javascript - 如何编写递归reduce函数?

sql - 聚合自引用表

C编程链表和删除

c - 遇到 fscanf 文件指针错误问题

c - 带有 (void*) 的函数指针

c - long long 和 long 在 64 位机器的 C 中有相同的范围吗?

c++ - 没有参数的递归,也不是静态或全局变量

c - 如何在 malloc 字符串上使用 fread

c - 当我访问时出现运行时错误 (table->array[i][i]).min = (table->array[i][i]).max = arr[i];

c - 使用 valgrind 进行 GDB 远程调试