2017-10-27 9 views
1

私は、文字列と配列を使用してcsvファイルからtxtファイルを出力する次のコードを持っています。また、 "input3.h"ファイルをTXTに転送します。このプログラムの開発は、Valgrindのによって確認された場合、それはこのプログラムの開発はすべて予約済みのストレージスペースを返すことができない、と私は、この問題のexcistを行う理由を理解していないことを言っていることValgrindによるC programmチェック:すべての予約済みストレージスペースを返すことができません

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "input3.h" 

/* Die Konstanten: 
* int MAX_LAENGE_STR - die maximale String Länge 
* int MAX_LAENGE_ARR - die maximale Array Länge 
* sind input3.c auf jeweils 255 und 100 definiert 
*/ 

int main(int argc, char **argv) { 
    if (argc < 3) { 
     printf("Aufruf: %s <anzahl> <bundesland>\n", argv[0]); 
     printf("Beispiel: %s 100 Bayern\n", argv[0]); 
     printf("Klein-/Großschreibung beachten!\n"); 
     exit(1); 
    } 
    int anzahl = atoi(argv[1]); 
    char *bundesland = argv[2]; 

    // Statisch allokierter Speicher 
    char staedte[MAX_LAENGE_ARR][MAX_LAENGE_STR]; 
    char laender[MAX_LAENGE_ARR][MAX_LAENGE_STR]; 
    int bewohner[MAX_LAENGE_ARR]; 

    int len = read_file("staedte.csv", staedte, laender, bewohner); 

    // Hier implementieren 
    char ** jg; 
    int cc = 0; 
    int cc_jg = 0; 

    for(int i = 0; i < len; i++) { 
     if((strcmp(bundesland, laender[i]) == 0) && (bewohner[i] >= anzahl)) { 
      cC++; 
     } 
    } 

    jg = (char **) malloc(MAX_LAENGE_ARR*sizeof(char *));; 
    for (int j = 0; j < len; j++) { 
     jg[j] = (char*)malloc(MAX_LAENGE_STR*sizeof(char)); 
    } 

    for(int i = 0; i < len; i++) { 
     if((strcmp(bundesland, laender[i]) == 0) && (bewohner[i] >= anzahl)) { 
      sprintf(jg[cc_jg], "Die Stadt %s hat %d Einwohner.", staedte[i], bewohner[i]); 
      cc_jg++; 
     } 
    } 

// Mithilfe von write_file(...) soll das Ergebnis in die "resultat.txt" 
    write_file(jg, cc_jg); 

    // Dynamisch allozierter Speicher muss hier freigegeben werden. 
    for(int l = 0; l < cc; l++) { 
     free(jg[l]); 
    } 
    free(jg); 
    return 0; 
} 

私の問題、それを。

+0

[コンプリート**、最小**、かつ検証例](http://stackoverflow.com/help/mcve)。 'MAX_LAENGE_ARR'とは何ですか? 'MAX_LAENGE_STR'とは何ですか?それらはどう定義されていますか?彼らの価値は何ですか? –

+1

あなたは 'len'ポインタを割り当てますが、' cc'ポインタだけを割り当てます。 –

+0

文字列と配列の最大長として定義されます。 'MAX_LAENGE_STR'の値は255で、' MAX_LAENGE_ARR'は100です。 – Ryoine

答えて

0

jg[j]len回のmallocを実行しますが、cc回だけ解放してください。

正しくあなたはどうなる:ありません

for(int l = 0; l < len; l++) { 
     free(jg[l]); 
    } 
関連する問題