2016-12-06 10 views
-4

最近、動的プログラミングの基礎を理解しようとしていましたが、ヒープ破損に関するいくつかの問題に直面しています。メモリを解放しようとすると、コードが壊れます。 私はインターネット上でいくつかの調査をしました。私はいくつかの未割り当てのメモリ空間に書き込むので、私はこのメッセージを受け取りました。しかし、私はまだ間違いがどこにあるか、またはそれを修正する方法を知らない。通常ブロック(#164)の後でヒープの破損が検出されました

#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); 
} 
+0

してください[MCVE]を提供するために、[編集]あなたの質問この行は理にかなっているように、コードを並べ替えます。 –

+0

** na **と** nb **はnullです(0に等しい)ので、あなたは 'malloc(na * sizeof(int))'を実行するときにメモリを割り当てません。 * nb ** –

+0

私は以前にC++を学んだ後、Cの学習をしています。それがあなたを気にしたら、すみません。 –

答えて

1
int na = 0; 
int *a = (int*)malloc(na*sizeof(int)); 
read(a, na); 

ここで問題があります。サイズ0のバッファを作成し、そのバッファに "in"を書きます。あなたがサイズを読んだ後であるサイズを把握するときだけ、バッファを作成する必要があります。まだ

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

またはそれ以上:

std::vector<int> a = read(); 
関連する問題