私が書くなら:
char *a=malloc(sizeof(char)*4);
a="abc";
char *b="abc";
このメモリを解放する必要がありますか、それとも私のシステムによって行われますか?
あなたの状況では、動的に割り当てられたメモリへの参照を失っているため、動的に割り当てられたメモリを解放する方法はありません。
これを試してみてください:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *a=(char*)malloc(sizeof(char)*4);
printf("Before: %p\n",a);
a = "abc";
printf("After: %p\n",a);
free(a);
char *b = "abc";
return 0;
}
あなたが得るでしょう
Before: 0x100100080
After: 0x100000f50
2つのポインタが異なることがわかります。これは、文字列リテラル"abc"
がバイナリファイルのデータセクターに配置されるためです。
a = "abc"
のポインタをa
定数リテラル文字列を指すように変更する"abc"
と、以前に割り当てられたメモリが失われます。動的に割り当てられた有効なアドレスをポイントしなくなったという理由だけで、呼び出しfree
は正しくなくなりました。a
ポインタを保持して解放できるようにするには、次の文字列をコピーする必要があります。
strncpy(a, "abc", 4)
これにより、文字がリテラルから動的に割り当てられたメソッドに効果的にコピーされ、元のポインターが保持されます。
ここでメモリリークが発生しました。を設定するa="abc"
と、割り当てたばかりのメモリがいっぱいになるのではなく、静的文字列「abc」を指すようにポインタが再割り当てされます。 b
同じ静的文字列を指します。
代わりに必要なのはstrncpy(a, "abc", 4)
、「abc」の内容を割り当てたメモリ(をa
指す)にコピーすることです。
次に、終了時にそれを解放する必要があります。
簡単な答えはい、いいえ。また、コードにバグがあります。
具体的な答え:
char *a=malloc(sizeof(char)*4);
メモリを割り当てるので、それを解放する必要があります。
a="abc";
これにより、定数文字列へのポインタがに割り当てられますchar* a
。そうすることで、最初の行に割り当てられたメモリへのポインタを失うため、定数文字列を解放しないでください。
strcpy(a,"abc");
代わりにを使用a="abc";
して、割り当てられたメモリに文字列を移動します。
C では、この方法で文字列を代入することはできません
a = "abc"
ただし、使用する場合は、このようmalloc
に使用する必要がありますfree
free(a);
ただしfree(a)
、例で使用するとエラーが発生することに注意してください。malloc
ポインタa
値を静的文字列に変更した後"abc"
; 次にfree(a)
、静的データの解放を試みます。そして、エラーが発生します。
はい、メモリリークが発生します。システムはケースを処理できませんでした。
はい、malloc によって返されたメモリを解放する必要があります。