2016-11-17 4 views
1

charの配列:無料()私はこれを持っている**

struct Library { 
    char letter; 
    int capacity; 
    int size; 
    char** words; 
}; 
typedef struct Library Lib; 

ライブラリの配列を初期化します。

void InitLibrary(Program* startup) { 
    char alphabet[26] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; 
    startup->dictionary = malloc(sizeof(Lib) * 26); 
    int i; 
    for (i = 0; i < 26; i++) { 
     startup->dictionary[i].letter = alphabet[i]; 
     startup->dictionary[i].capacity = INIT_CAPACITY; 
     startup->dictionary[i].size = 0; 
     startup->dictionary[i].words = malloc(sizeof(char*) * startup->dictionary[i].capacity); 
    } 
} 
ここ

私は配列words移入:

void FillDicoFromFile(Program* startup){ 
    while((!feof(startup->f) && !ferror(startup->f))){ 
     char* word = malloc(sizeof(char) * 30); 
     fscanf(startup->f, "%s", word); 
     ToLowerCase(word); 
     int indexLib = word[0] - 97; 
     int sizeLib = startup->dictionary[indexLib].size; 
     startup->dictionary[indexLib].words[sizeLib] = word; 
     startup->dictionary[indexLib].size++; 
    } 
    CountTotalWords(startup); 
    rewind(startup->f); 
} 

をこのような関数:

void CleanDico(Program* startup){ 
    int i = 0; 
    for(; i < startup->dictionary[i].size; i++){ 
     int j = 0; 
     for(; j < startup->dictionary[i].size; i++){ 
      free(startup->dictionary[i].words[j]); 
      startup->dictionary[i].words[j] = NULL; 
     } 
     startup->dictionary[i].size = 0; 
    } 
    startup->totalWords = 0; 
} 

私は、配列の上限を得るために、私の構造体の上に私の配列のサイズを持って、そしてすべて使用した細胞を解放しますが、それぞれの時間は、私がCleanDicoを呼び出し、コードがクラッシュします。助言がありますか?

私はすでにa question on a problem with a char arrayを求めてきました。今私はアレイにfree()したいです。私はここにたくさんの投稿を読んでいて、多くのソリューションをテストしましたが、私の問題を解決するのには役に立たなかったのです。

私はCleanDicoにSEGMENTATION_FAULTを取得し、私は、エラーに関する他の情報を持っていません。 Code on Debug ::ブロックのエラーメッセージが悪い

+2

ここに[MCVE]が必要です。ここでシェービングしたコードは問題なく表示されますが、問題は表示されなかったコードの可能性が高いです。 –

+0

クラッシュする行は何ですか?メッセージは何ですか? – nicomp

+2

MCVEを投稿する必要があります。'malloc'バグは追跡が難しく、多くの場合、バグがどこにあるかに無関係にコード内の場所でエラーが発生します。 'valgrind'のようなツールを使って問題の原因を見つけるのを助けることをお勧めします。 (特に、あなたは/ words/'words 'に文字列をどこに配置するかはわかりませんが、外側のものと同じようにインデックスを使用しています...) – BadZen

答えて

4

あなたの代わりに

for(; i < startup->dictionary[i].size; i++){ 
+0

for(i = 0; i < startup-> dictionary [i] .size; i ++) 'を実行すると、その上にiとjを初期化する必要はありません。 :) – user3794667384

+0

それでも、コードはクラッシュし続けます。そしておかげで、それは間違ったコピー/ペーストだったと確信しています...私はC89で動作しないので、うまくいきません^^ – Maillful

+0

valgrindをフラグ-gと一緒に使用すると、私たちはそれに答えるのがより簡単になります! :D – user3794667384

2

すべてmalloc()calloc()、またはrealloc()は、対応するfree()(またはrealloc())と一致しなければならないの

for(; j < startup->dictionary[j].size; j++){ 

を行うためのもののために私はあなたの第二の上だと思います。

あなたのポインタの配列を与える
startup->dictionary[i].words = malloc(sizeof(char*) * N); 

は、初期化されていない(彼らはゴミが含まれている):

あなたはこれを持っています。

free(startup->dictionary[i].words[j]); 

あなたが初期化されていないポインタの割当てを解除し、どの:

後で、これを持っています。割り当てたものの割り当てを解除できません。

別のデータ構造を考えてみることもできます。charの1つの巨大な配列にすべての単語と、各単語に1つのポインタを含むchar*という1つの配列を割り当てます。この方法では、常に2つの割り当てと割り当て解除が行われます(すべての単語の最大サイズがわからない場合は、realloc()が必要な場合があります)。

+0

投稿を編集したところで、配列の各セルに 'malloc()'を実行します – Maillful

+0

今のところ、 'malloc()'はデバッグ/テスト用の巨大な配列ですが、 'CleanDico()'が動作するとき、容量に関してより具体的になり、いっぱいになったら 'realloc()'を実行します。 – Maillful

1

ループのためのあなたのインナーにもi変数をインクリメントします。だから、それはインデックスから外れます。

EDIT:26文字のため、アウターループは26回実行する必要があります。

for(; i < 26; i++){ 
    int j = 0; 
    for(; j < startup->dictionary[i].size; j++){ 
     free(startup->dictionary[i].words[j]); 
     startup->dictionary[i].words[j] = NULL; 
    } 
    startup->dictionary[i].size = 0; 
} 
+0

私の悪い、ちょうど悪いコピー/貼り付け、良い変数でも、コードがクラッシュし続ける。 – Maillful

+0

私の最後の編集で確認できます – cokceken

+0

はい、あなたの編集前に見た^^ので、動作するように見えますが、別のファイルを読み込み、配列を補充したいときにクラッシュします。 – Maillful

関連する問題