3
int i;
char *s = (char*)malloc(sizeof(char)*10);
for(i = 0; i <= 4; ++i)
    s[i] = 'a';
s[5] = '\0';
printf("%s\n", s);
free(s).

上記のコードにメモリリークの問題はありますか? 関数「free」は、解放する必要があるメモリの数をどのように知るのですか?

4

3 に答える 3

4

コードにメモリリークはありません。2番目の質問に関しては、電話をかけるとmalloc、単にメモリを返すだけではありません。freeCライブラリは、呼び出したときに正しいことを実行できるように、独自のヘッダーと簿記情報を配置するためのスペースを確保しています。

コードに関するいくつかの編集上の注意:

  • malloc()Cプログラムでの戻り値をキャストする必要はありません。void *(をmalloc()返す)と他のポインタ型の間の変換は、Cで暗黙的に行われます。

  • sizeof(char)1、なぜわざわざ書き出すのですか?

  • ループは3文字をに書き込み、プログラムはを追加する前にs文字()をスキップします。それは少し奇妙です。ループで使用するつもりでしたか、それともその後で使用するつもりでしたか?s[4]\0i <= 4s[4] = '\0'

  • あなたはあなたの電話の後.ではなくむしろ持っています。ただし、この方法ではコンパイルされないため、プログラムではなく、ここではタイプミスにすぎないと思います。;free()

于 2013-01-22T02:04:27.133 に答える
2

漏れません。ライブラリは、すべてのブロックに割り当てられたサイズを内部的に追跡するため、解放する量を認識しています。それを行う正確な方法は、リリースごとに変更される可能性のある実装の詳細であり、気にする必要はありませmallocん。malloc

于 2013-01-22T02:04:57.163 に答える
0

いいえ、最後にsを解放し、sを超えて使用することはありません。大丈夫だと思います。

于 2013-01-22T02:04:39.073 に答える