0

メモリ割り当てについて質問があります。ブロックchar*内でa を宣言すると、ブロックの実行が完了すると が破棄されます。ブロックはループ内にあるため、何度も反復されます。ただし、次の例に示すように、ブロックで宣言された が変数にエイリアスされている場合はどうなるでしょうか。私の質問は、このようなものをどのように支払うのですか? 一時変数を解放すると、保持したい変数も解放するため、セグメンテーション違反が発生するように感じます。もしそうなら、私はその声明がどこに行くのか途方に暮れています.elsechar*elseelsewhilechar*elsemalloc'dchar*free

char* print_path = NULL;

(をちょきちょきと切る)

  (while)

 else{
        char* temp_path = print_path;
        int temp_size = strlen(temp_path)+strlen(file_name(child->fts_path))+1;
        print_path = (char*)malloc(temp_size);
        strcpy(print_path, temp_path);
        strncat(print_path, file_name(child->fts_path), strlen(file_name(child->fts_path)));
        printf("%s:\n\n", print_path);
        }

(をちょきちょきと切る)

再度実行されないことがわかった後、プログラムの最後で print_path を解放することを指摘したいと思います。ただし、解放したいのはループの中間実行です。どんな助けでも大歓迎です。ありがとう!

4

3 に答える 3

2

free(temp_path)それは正しいことのように見えます。次のようになります。

char * print_path = malloc(...);    // "NULL" is also possible

while (condition)
{
    if (...)
    {
         // ...
    }
    else
    {
        char * temp_path = print_path;

        print_path = malloc(...);

        free(temp_path);
    }
}

free(print_path);

print_pathアルゴリズムの不変条件は、常に動的に割り当てられていないメモリを指す(またはそうあるべきです) ことです。freeごとに正確に 1 つあることに注意してくださいmalloc

于 2012-09-27T21:00:57.883 に答える
0

私がやりたいことの要点は同じ変数にメモリを再割り当てすることなので、mallocではなくreallocを調べるべきだったと思います。

于 2012-10-06T21:32:49.427 に答える
0

2 つのポインターがあります。

print_paths: のような配列を['h','e','l','l','o']指します。このポインターには、配列の最初の要素のアドレスが含まれます。この場合は を指しhます。これのアドレスが であるとしhましょう。番号が含まれています。1e2print_path1

temp_path: このポインタは何も指していないか、メモリ内のランダムな場所を指しています。

を呼び出すとmallocmallocいくつかのメモリが要求され、新しく割り当てられたメモリのアドレスが表示されますが、このメモリにはガベージが含まれています。

だから後

print_path = (char*)malloc(temp_size);

print_pathtemp_size新しく割り当てられたメモリのアドレス、ガベージを含むサイズの新しい配列が含まれています。このアドレスが 40 であるとしましょう。したがって、 の値はprint_pathです40

最後に、あなたが呼び出すとき:

strcpy(print_path, temp_path);

temp_path配列( ['h','e','l','l','o'])の値を が指す配列にコピーします。print_pathつまり、40ガベージを含むアドレスの代わりに、h、含むなどのアドレスが41含まeれます。

1address (と40) の両方に value が含まれていてhも、一方を変更しても他方には影響しないことに注意してください。

の最適な場所はfree(temp_path)の終了else直前です。メモリが割り当てられていることを確認してください。temp_path取得できなかったメモリを解放しようとすると、問題が発生するmalloc可能性があります。

于 2012-09-27T21:51:36.590 に答える