2016-04-08 6 views
2

ファイル入力から取得する必要があるn * m次元のマップを作成しています。地図の各位置は距離カウントのために重要です。実行サイクル全体で私は4つのmalloc()呼び出しを行いますが、4つのfree()呼び出しにそれらを一致させることはできません。あるいは、実行が完了するかどうかはわかりません。Cの構造体内に不安定なfree()呼び出しを修正する方法

ここでは主なコールだ:

int main() 
{ 
    map_t newMap; 
    newMap = map_create(30, 30); 

    //there's some test calls that I'm ommiting as they simply work and don't matter 

    map_destroy(newMap); 
    return 0; 
} 

map_t私は理解して、私が望むようにそれは以下のように、ヘッダファイルに定義されています、構造体へのポインタです:

typedef struct map *map_t; 

それは実装ですカプセル化の問題については、対応する.cファイルにあります。ここでの実装とケースのための重要な機能です:完全性の問題については

struct map{ 
    position_t **positions; 
    int lines, columns; 
}; 

map_t map_create(int n, int m) 
{ 
    map_t newMap = malloc(sizeof(map_t)); 

    newMap->lines = n; 
    newMap->columns = m; 

    newMap->positions = malloc(n * sizeof(position_t*)); 
    int i; 
    int k; 
    for(i = 0; i < n; ++i) 
    { 
     newMap->positions[i] = malloc(m * sizeof(position_t)); 
     for(k = 0; k < m; ++k) 
     { 
      newMap->positions[i][k] = position_create(); 
     } 
    } 

    return newMap; 
} 

void map_destroy(map_t map_p) 
{ 
    int i, k; 
    int n = map_p->lines; 
    int m = map_p->columns; 
    for(i=0; i < n; ++i) 
    { 
     for(k=0; k < m; ++k) 
     { 
      position_destroy(map_p->positions[i][k]); 
     } 
     free(map_p->positions[i]); 
    } 

    free(map_p->positions); 

    free(map_p); 
} 

は、ここに位置構造体の特定のコードが、それはマップの構造体の同じ考えを次のです。

問題の原因となっている無料通話を特定しましたが、その理由を理解できません。私がこれらの2行についてコメントすると:

free(map_p->positions); 
free(map_p); 

すべて正常に動作します。私はこのような最初のメモリを割り当てるために様々な方法を見てきました - How do I correctly set up, access, and free a multidimensional array in C? - しかし、そこに見つかった様々な解決策でも私は同じ不安定性を維持しています。

これは非常に簡単かもしれませんが、私は何かを見落としている可能性があります。私はこの解決策を実装しなければならない場合でも、この混乱に誰かの時間を借りるのが嫌いです何が間違っているかを少なくとも理解する。

コードは-Wall -g -cで警告を生成しません。-pedanticを追加すると、コメントに関する苦情が出ます。

事前に乾杯

EDIT:変更position_t newPosition = malloc(sizeof(position_t)); position_t newPosition = malloc(sizeof *newPosition);への行動はまだ同じ

EDIT2です、問題解決、私はこの問題を考えて全体の時間をmap_t malloc関数の変更の正確な型をしましたがあった**positions

+1

なぜ2D配列を使用しないのですか? – Olaf

+1

'position_t newPosition = malloc(sizeof(position_t));;のようなコードは、ポインタのサイズを割り当てますが、明確に期待しているものではありません。 – Soren

+0

ポインタである' position_t'の使用はありません。 3つ星のプログラマではないようにしてください(http://c2.com/cgi/wiki?ThreeStarProgrammer)。 –

答えて

0

最初のmalloc(sizeof(map_t));は、ポインタのための領域だけを割り当てます。 malloc(sizeof(*map_t));を使用する必要があります。

しかし、あなたはすでにそれを今見つけました。

関連する問題