-4
void* heap = malloc(100);
char *c = heap;
strcpy(c, "Terence");
printf("heap = %s\n", heap);
free(heap);
heap = malloc(100);
printf("heap = %s\n", heap);

出力は次のとおりです。

heap = Terence
heap = 

それは私が期待していることですが、今でははるかに複雑なコードがあり、構造は上記に似ていますが、出力は次のようになります。

heap = "Terence"
heap = "  ren  "

そんな感じ。

ヒープがクリーンアップされていないようですか?

それを解決する方法はありますか?

4

4 に答える 4

7

によって割り当てられたメモリ領域のmalloc初期値は不定です。

C標準から(強調鉱山):

(c99、7.20.3.3p2) 「malloc 関数は、サイズが size で指定され、値が indeterminate* であるオブジェクトにスペースを割り当てます。」

callocorのmemset後に使用mallocして、確定値を取得します。

于 2012-05-07T12:04:54.887 に答える
3

Malloc は、割り当てられたメモリを暗黙的にゼロに設定しません。この目的のために、calloc または memset のいずれかをセル化する必要があります。

heap = malloc(100);
memset(heap, 0, 100);

また

heap = calloc(100, 1);
于 2012-05-07T12:04:53.033 に答える
0

void free( void* ptr );以前に割り当てられたメモリ ブロックを解放するために使用する場合、ポインター変数を free 関数の引数として使用します。この関数はポインタ変数を読み取るだけで、自動的に NULL に設定しません。

したがって、その変数を NULL に設定するのはあなた次第です。これにより、その変数に依存する可能性のある、作成した他のコードが、問題ないように見えるがメモリを指すメモリ アドレスではなく、NULL ポインタを処理するようになります。もうアクセスできません。

于 2012-05-07T16:52:53.960 に答える
0

NULLメモリ ブロックを解放するときは、メモリにアクセスできなくなるため、常にポインタ変数を に設定する必要があります。

于 2012-05-07T12:27:10.220 に答える