15
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* f(void) {
  char *x;
  x = malloc(sizeof(char) * 4);
  strcpy(x, "abc");
  return(x);
}

int main(void) {
  char *a;
  a = f();
  printf("%s", a);
  free(a);
  return(0);
}

関数内の変数xを解放する必要がありますか? もしそうなら、私がそれを返す必要があるとき、それはどのように可能ですか?

4

6 に答える 6

14

関数内の変数 x を解放する必要がありますか?

はい(ちょっと、私の後のコメントを見てください)。を呼び出すたびにmalloc、後で を呼び出す必要がありますfree。そうしないと、リークがあります。ただし、覚えておいてください。xx が参照するメモリを解放しているのです 。

(アドレス) のxコピーを返すと、が作成され、呼び出し元に返されます。 自動保存期間で宣言されました。解放する必要があるのは、それが参照するメモリです。xx

もしそうなら、私がそれを返す必要があるときにそれはどのように可能ですか.

あなたの設計は、呼び出し元にメモリを解放する責任を負わせています。あなたはすでにメインでこれを行っています。もちろん、このメソッドを使用するには、動的に割り当てられたメモリへのアドレスを受け取っていることをコードのユーザーが認識できるように、関数を文書化する必要があります。

より良いアプローチ (IMO) は、バッファーを入力パラメーターとして使用することです。これで、このメモリの管理責任者 (呼び出し元) が明確になりました。おそらく、動的に割り当てたくさえありません。このデザインで、それは私の選択です。

void f(char *buf, size_t buf_size) {
  strncpy(buf, "abc", buf_size - 1);
  buf[buf_size-1] = '\0';
}

補足として、常に の戻り値をチェックする必要がありますmalloc。失敗する可能性があり、その場合は null ポインターが返されます。また、sizeof(char)は標準であることが保証され1ているので、そのビットを削除してmalloc(n).

于 2012-08-09T22:34:24.190 に答える
1

x関数を終了すると破棄されます。の値はx、動的に割り当てられたオブジェクトを指すアドレスです。関数を終了した後も、オブジェクトはまだ存在しています。

動的オブジェクトを解放するには、関数xによって返される値を関数に渡す必要があります。ffree

于 2012-08-09T22:39:42.820 に答える
1

はい、呼び出し元が解放する必要があります。などfreeをメインに。

x関数に戻るfと、アドレスのコピーが呼び出し元に返されます。free発信者はそのアドレスで発信できます。

于 2012-08-09T22:33:52.057 に答える
1

free(a);はい、解放する必要がありますが、それを行うと既に解放されていますmain(は行でaequal に割り当てられているため)。xa = f();

于 2012-08-09T22:35:33.530 に答える
0

呼び出すmallocと、メモリが割り当てられ、そのメモリブロックの初期アドレスが返されます。

あなたの場合、あなたはこのアドレスを呼び出し先に戻します。これで、呼び出し先であるmainがアドレスの割り当てを解除する責任があります。

メモリブロックの割り当てを解除するために必要なのは初期アドレスだけです。AFIKOSは、かなり複雑なアルゴリズムを使用してメモリの割り当て/解放を担当しますが、プログラムは初期メモリアドレスを追跡するだけで済みます。このアドレスは、他の整数値と同じように格納または移動できます。これは、32ビットシステムではすべてがint値であるためです。

于 2012-08-09T22:39:48.227 に答える
0

あなたはコードがうまく機能し、afによってmallocされた文字列を解放しました。

于 2012-08-09T22:40:54.807 に答える