Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在正常块(#164)之后检测到堆损坏_C++ - Fatal编程技术网

C++ 在正常块(#164)之后检测到堆损坏

C++ 在正常块(#164)之后检测到堆损坏,c++,C++,最近,我一直在努力理解动态编程的基础知识,现在我面临一些堆损坏的问题。当我试图释放内存时,我的代码中断。 我在互联网上做了一些研究,我发现我收到这条消息是因为我在一些未分配的内存空间中写作。然而,我仍然不知道错误在哪里,或者如何修复它 #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <fstream> std::ifstream f("file.in"); vo

最近,我一直在努力理解动态编程的基础知识,现在我面临一些堆损坏的问题。当我试图释放内存时,我的代码中断。 我在互联网上做了一些研究,我发现我收到这条消息是因为我在一些未分配的内存空间中写作。然而,我仍然不知道错误在哪里,或者如何修复它

#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);
}
#包括
#包括
#包括
#包括
std::ifstream f(“file.in”);
无效读取(int*a,int&n)
{
f>>n;///scanf(“%d”和&n);
int i;
对于(i=0;i>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));
读(a,na);
阅读(b,nb);
而(i
问题出在这里。您创建一个大小为0的缓冲区,然后将其写入。必须仅在计算出大小(即读取大小后)时创建缓冲区。重新排列代码,使此行有意义:

int na = 0;
int *a = read(na);
或者更好:

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

请提供你的问题。NA和NB是空的(等于0),所以当你做<代码> Malc(N*siZeof(int))< /> >时,不分配内存,同样,对于使用NB的B分配来说也是一样。我是一个在学习C++之后现在学习C的学生,现在我在代码中使用它们。抱歉,打扰了。你的内存分配混乱,你应该使用正确的C++容器,而不是C风格的Maloc等等。
a
b
都以大小0开始,但在对
read
的前两次调用中,您尝试将元素存储在它们中-从那时起,堆上的元素已损坏,所有赌注均已取消…请不要这样做。C或C++中的代码,但尽量避免两者混合
std::vector<int> a = read();