在普通块(#164)之后检测到堆损坏

Heap Corruption Detected after normal block (#164)

本文关键字:检测 之后 损坏 #164      更新时间:2023-10-16

最近,我一直在尝试了解动态编程的基础知识,现在我正面临着堆腐败的一些问题。当我尝试释放内存时,我的代码断开。我已经在互联网上进行了一些研究,发现我收到了此消息,因为我在一些未分配的内存空间中写了这一消息。但是,我仍然不知道错误在哪里或如何解决。

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <fstream>
std::ifstream f("file.in");
void read(int *a, int &n)
{
    f >> n;///scanf("%d", &n);
    int i;
    for (i = 0; i < n; i++)
        f >> a[i];/// scanf_s("%d", &a[i]);
}
int main()
{
    int *a, *b, *c;
    int na = 0, nb = 0;
    int i = 0, j = 0, k = 0, kk = 1, p;
    a = (int*)malloc(na*sizeof(int));
    b = (int*)malloc(nb*sizeof(int));
    c = (int*)malloc(kk * sizeof(int));
    read(a, na);
    read(b, nb);
    while (i < na && j < nb)
    {
        if (a[i] < b[j])
        {
            kk++;
            c = (int*)realloc(c, kk * sizeof(int));
            c[k] = a[i];
            k++;
            i++;
        }
        else
        {
            kk++;
            c = (int*)realloc(c, kk * sizeof(int));
            c[k] = b[j];
            k++;
            j++;
        }
    }
    if (i < na)
        for (p = i; p < na; p++)
        {
            kk++;
            c = (int*)realloc(c, kk*sizeof(int));
            c[k++] = a[p];
        }
    if (j < nb)
        for (p = j; p < nb; p++)
        {
            kk++;
            c = (int*)realloc(c, kk *sizeof(int));
            c[k++] = b[p];
        }
    for (i = 0; i < k; i++)
        printf("%d ", c[i]);
    free(a);
    free(b);
    free(c);
}
int na = 0;
int *a = (int*)malloc(na*sizeof(int));
read(a, na);

这是问题。您可以创建一个大小为0的缓冲区,然后在"中写入"。仅当您弄清楚大小后,才必须创建缓冲区。重新排列代码以使该行有意义:

int na = 0;
int *a = read(na);

或更高:

std::vector<int> a = read();