2009-06-06 25 views
0

ポインタの練習とメモリの割り当てに問題が発生しました。C言語でメモリを解放する際のエラー

ただし、メモリを解放するとスタックダンプが発生します。私は正しい場所で解放していますか?それが安全でない可能性がある私のプログラムに何か間違っていますか?

void display_names(char **names_to_display, char **output); 

int main(void) 
{ 
    char *names[] = {"Luke", "John", "Peter", 0}; 
    char **my_names = names; 
    char *new_output[1024] = {0}; 
    size_t i = 0; 

    // Print the ordinal names 
    while(*my_names) 
    { 
     printf("Name: %s\n", *my_names++); 
    } 

    my_names = names; /* Reset */ 
    display_names(my_names, new_output); 

    // Print the updated names 
    while(new_output[i]) 
    { 
     printf("Full names: %s\n", new_output[i]); 
     i++; 
    } 

    // Free allocated memory 
    free(new_output); 

    getchar(); 

    return 0; 
} 

void display_names(char **names_to_display, char **output) 
{ 
    while(*names_to_display) 
    { 
     *output = (char*) malloc(strlen("FullName: ") + strlen(*names_to_display) + 1); 
     if(!*output) 
     { 
      fprintf(stderr, "Cannot allocate memory"); 
      exit(1); 
     } 

     // Copy new output 
     sprintf(*output, "FullName: %s", *names_to_display++); 
     printf("display_names(): Name: %s\n", *output++); 
    } 
} 
+0

編集して問題を削除しましたか?それともそれはまだ問題/質問ですか? – epatel

+0

コードを編集して実行しました。すべてうまくいった。しかし、これが別の関数で割り当てられているメモリを解放する正しい方法であれば、私は最終的な答えを得たいだけでした。 – ant2009

+0

はい、これは正しい方法です – mfawzymkh

答えて

12

あなたはそれがコンパイラによって割り当てられた、new_output用のメモリを割り当てることができませんでした。 freeは、コンパイル時にコンパイラによって割り当てられたメモリを解放するのではなく、実行時にmallocメモリを使用するときに使用します。

あなたのnew_outputはローカル変数であり、スコープ外に出たとき、つまり宣言されている関数の閉じ括弧で外に出たときに '解放'されます。

7

あなたの問題は、あなたが言うときということです:

free(new_output); 

new_outputは、スタック上の配列です。 malloc()で割り当てられていないので、free()で解放することはできません。 new_outputに含まれているポインタを解放する必要があります。

7

char * new_display [1024]の宣言は、1024要素の配列を宣言することを意味し、各要素はcharへのポインタです。 配列自体が静的にここに割り当てられます。1024要素の配列がスタックに予約されます。 あなたの例では、mallocを使用してメモリを割り当て、配列の各要素を設定することによって、この配列のエントリを作成します。これは、静的に割り当てられた配列自体ではなく、解放する必要のあるメモリです。

代わり自由(new_display)を呼び出すだから、あなたは、配列エントリをループする必要があると自由(new_display [i])と、あなたが割り当てられているだけ何を解放しているこの方法を行います。

+0

自分のコードを編集しました。今私は割り当てられたメモリを解放するwhileループを持っています。これはあなたの答えの正しい解釈ですか?私のコードに間違って見えることがありますか?ありがとう – ant2009

+0

私はあなたが今書き込むと思う、それはまだクラッシュですか? – mfawzymkh

+0

申し訳ありませんが、私はそれが正しいことを意味しました:) – mfawzymkh

関連する問題