2016-04-09 8 views
-4

malloc()を使用すると、free()ポインタがあることを誰もが知っています。プロセス。なぜ私はmalloc()を使わないで割り振った後にfree()を使わなければならないのですか

しかし、なぜ私はポインタを割り当てるときに、ヒープなしfree()を使用する必要はありません。

char* text0 = calloc(20, sizeof (char)); 
strncpy(text0, "Hello World", 20); // Remember to use `free()`! 
char* text1 = "Goodbye World!"; // No need for `free()`? 

もヒープに割り当てられたメモリを指し、スタック上のポインタtext1はありませんか?なぜfree()の必要はありませんか?

+0

メモリを解放しないようにメモリを割り当てないでください。 –

+2

あなたのコードはどこにも正しいものがありません。あなたはコンパイラの警告とペダンティックモードを試しましたか? –

+0

メモリリークがあります。 –

答えて

4

文字列定数"Goodbye World!"は、プログラムの起動時にグローバルな読み取り専用メモリセクションに配置されます。ヒープに割り当てられたのはではなく、です。 "Hello World"でも同じです。

割り当て後、text1はこの静的な文字列を指します。文字列はヒープ上に存在しないため、無料で呼び出す必要はありません。 で割り当てられたすべてのメモリには、

3

freeを使用する必要があります。ヒープからメモリを割り当て、後で使用できるようにヒープを戻す必要があります。で

char* text0 = calloc(20, sizeof(char)); // this memory must be freed. 

text0 = "Hello World"; 

あなたは、割り当てられたメモリへのポインタをovewrite。メモリは今や失われ、再利用/再利用できません。

sizeof(char)char周りの括弧とは、あなたが「文字へのポインタ」型の変数に文字列定数のアドレスを割り当てているように私はtext0*を落としたことに注意してください。コンパイル時に警告をオンにする!

あなたは行っている必要があります。

free(text0); 
text0 = "Hello World"; // DON'T use `free()`! 

注意を再び私は*を落としました。コンパイル時に警告を発する理由が増えました。

char* text1 = "Goodbye World!"; // No need for `free()`? 

いいえ、ヒープから割り当てられていないため、無料で電話する必要はありません。

+0

あなたの答えにはいくつか問題があります。 'sizeof char'は括弧を必要とします。 '* text0'は' char'であるため、 '* text0 =" ... "'は間違っています。 –

+0

@ Cool-Guy、 'sizeof char'の周りの括弧:それは彼のコードであり、後で私は彼に警告をオンにするように伝えます。私はこれを私の答えに加えます。 –

+0

あなたの答えはまだ混乱しています。 "* text0 =" Hello World ";' _ 'しかし、 '* text0'は' char'であり、意味をなさない文字列リテラルを割り当てようとしているので間違っています。 –

関連する問題