c - 调试断言失败 _crtisValidHeapPointer(block)

标签 c malloc realloc

我正在尝试在 c/c++ 中实现快速排序,但每次运行代码时,我都会不断收到此错误“Debug assertion failed _crtisValidHeapPointer(block)”。

我的代码是:

void QuickSort(int *A, int size) {
if (size < 2) return;
int *L = NULL, *R = NULL, RSize = 0, LSize = 0;

R = (int *)malloc(sizeof(int));
L = (int *)malloc(sizeof(int));

for (int i = 0; i < size; i++) {
    if (A[size - 1] <= A[i]) 
        if( ((int *)realloc(R, (sizeof(int) * (RSize + 2) ))) != NULL )
            R[RSize++] = A[i];
    else 
        if ( ((int *)realloc(L, (sizeof(int) * (LSize + 2) ))) != NULL )
            L[LSize++] = A[i];
}

    QuickSort(L, LSize);
    QuickSort(R, RSize);
    Merge(A, L, R, LSize, RSize);
    free(L);
    free(R);
    return;
}

我知道这与我的数组 L 和 R 的内存分配有关,但我似乎无法弄清楚问题到底是什么。

编辑:找到解决方案

代码:

void QuickSort(int *A, int size) {
if (size < 2) return;
int *L = NULL, *R = NULL, RSize = 0, LSize = 0;

for (int i = 0; i < size; i++) {
    if (A[size - 2] < A[i]) {
        if ((R = (int *)realloc(R, (sizeof(int) * (RSize + 1)))) != NULL) 
            R[RSize++] = A[i];
    }
    else {
        if ((L = (int *)realloc(L, (sizeof(int) * (LSize + 1)))) != NULL) 
            L[LSize++] = A[i];
    }
}
     QuickSort(L, LSize);
     QuickSort(R, RSize);
     Merge(A, L, R, LSize, RSize);
     free(L);
     free(R);
     return;
}

最佳答案

问题出在这里:

if( ((int *)realloc(R, (sizeof(int) * (RSize + 2) ))) != NULL )
    R[RSize++] = A[i];

realloc 函数返回 新的数组指针,它在if 中与NULL 进行比较,然后被丢弃。然后原始(无效)指针被取消引用,破坏堆。

要修复,请务必将 realloc 的结果分配给指针。

if( (R = (int *)realloc(R, (sizeof(int) * (RSize + 2) ))) != NULL )

您还应该包括一些错误检查以中止循环,以防分配失败,以 else 语句的形式对此 if 进行检查。如当前所写,如果 realloc 失败,则循环将继续完成,每次迭代都会跳过数组,然后返回损坏的结果。

关于c - 调试断言失败 _crtisValidHeapPointer(block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35611101/

相关文章:

c - 从 C 运行 shell 脚本

c# - 从 C 移植到 C# 时是否需要 __W64?

c - C 中的 malloc 与 mmap

c - 写入分配的二维数组

c - 内置函数clock()在atmel studio 7.0中不起作用

c - 关于在 Objective-c 堆上分配 c 结构和数组所需的指南

比较这些二叉树节点实现的空间复杂度?

c - Realloc 操作超出其范围的数据

c - 为什么函数内部的重新分配无法使用英特尔编译器执行?

c - 使用 free 和 realloc