下面是进行合并排序的函数。但我执行时遇到错误。每次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/