2011-07-19 8 views
1

私は以下のようなリンクリストを構築するために使用する構造体を持っています。最近解放されたメモリの割り当て

struct my_struct{ 
    char a[16]; 
    struct my_struct *next; 
} 

私はその機能を以下のリンクで解放します。私のプログラムで

void free_my_list(struct my_struct* recv) { 

    if (recv->next != NULL) 
     free_my_list(recv->next); 

    free(recv); 
    recv = NULL; 
} 

、私は何度も構造体_my_listを使用しますが、無料で、それを以下のように毎回をmalloc:

struct my_struct *_my_list; 

free_my_list(_my_list); 
_my_list = (my_list *) malloc(sizeof(my_list)); 
_my_list->next = NULL; 

私はリストを埋めるたびに、私は、charの配列を印刷し、その後リセット上記のコードで_my_struct。 上記のコードは、Ubuntuのpcではうまく動作しますが、最初のリスト(最初のmalloc _my_structの後)を正しく印刷した後、Cent OS上で次のリストが破損したデータとして出力されます。

プログラムの実行中にmallocメモリを解放しないと、Cent OSでも正常に動作しますが、printf()コールの間にリスト_my_listをリセットする必要があります。

_my_listは、以下の関数を使用して塗りつぶされ、出力されます。

/*prints every item in my_list*/ 
void print_my_list(struct my_struct *recv, FILE *fd) { 

    my_list *tmp; 
    tmp = recv; 

    while (tmp != NULL) { 
     if (fwrite(tmp->a, 1, strlen(tmp->a), fd) == -1) { 
       pritnf("error\n"); 
     } 
     tmp = tmp->next; 
    } 
} 

/*Add 'a' string to _my_list*/ 
void add_recv_to_list(struct my_struct **recv_list, char *recv) { 

struct my_struct *tmp; 
tmp = *recv_list; 

if (*recv_list == NULL) { 
    *recv_list = (struct my_struct *) malloc(sizeof(struct my_struct)); 
    tmp = *recv_list; 

} else { 

    while ((tmp->next) != NULL) { 
     tmp = tmp->next; 
    } 
    tmp->next = (struct my_struct *) malloc(sizeof(struct my_struct)); 
    tmp = tmp->next; 

} 
strncpy(tmp->a, recv, MAX_NAME_LEN); 
tmp->next = NULL; 
} 

どのような理由がありますか?あなたがSTRUCを初期化すると

struct my_struct *_my_list; 

free_my_list(_my_list); 
_my_list = (my_list *) malloc(sizeof(my_list)); 
_my_list->next = NULL; 

は:struct my_struct *_my_list;あなたがそれに任意の値を割り当てていないので、事前にメモリにあったものは何でもゴミデータ保持

+0

また、 ' –

+0

'構造体my_struct'をmy_list'され、あなたの投稿:とにかく、NULLへのポインタを初期化)してにあなたのfree_my_list機能を変更します。?完全なサンプル。typedefまたはいくつかの構造体がありません –

+1

あなたはどのようにリストに値を設定しますか?また、recv = NULLは空きリスト関数で何もしませんmy_struct **を渡す方が良いので、そのルーチン。 –

答えて

1

私はあなたの問題はここから始めていると思います。あなたはfree()のfree_my_listで動作が定義されていません(あなたは決してmalloc()を解放していますので、結果が非​​常にうまく壊れている可能性があります)。宣言をstruct my_struct *_my_list = NULL;に変更してみてください。私はあなたがリストを埋めるコードを表示する必要があると思う

void free_my_list(struct my_struct* recv) { 
    if (recv == NULL) 
     return; 

    if (recv->next != NULL) 
     free_my_list(recv->next); 

    free(recv); 
    recv = NULL; 
} 
関連する問題