をコンパイルの問題があるため、 free
は関数なので、引数をかっこで囲む必要があります。
free(val);
もう一つの問題はメモリリークです。
Cの文字列は実際にはchar
データを含むメモリブロックへのポインタです。文字列の末尾には値0のchar
と表示されます。覚えておくべきことは、変数が他のポインタと同様のポインタであることです。だから... ...
char *val = (char *) malloc(12*sizeof(char));
上の行は動的にメモリのブロックを割り当て、val
にそのポインタを割り当てます。
val = "feels....";
上の行は、val
であった以前のポインタを上書きval
にリテラル文字列へのポインタを割り当てます。いずれにしても、最初の行にあるmalloc
のメモリブロックには触れていません。さらに、ブロックが漏れてしまったので、あなたは参照ブロックを失ってしまいました。 free
への道はありません。
通常、文字列リテラルはコンパイル時に作成され、占有するメモリはプログラムの一部になります。これはヒープから来ていないことを意味します(malloc
はそのメモリを取得します)。つまり、free
文字列リテラルを試すと、悪いことが起こります。近代的なアーキテクチャでは、プログラムテキストはOSレベルではそれのfree
一部にしようとすると、ほぼ確実にあなたのプログラムがクラッシュします。
限り、あなたは文字列の内容を変更したくないとして、あなたはそれにmalloc
空間にする必要はありません。あなたはmalloc
を省略することができます文字列リテラルの変更可能なコピーを取得する最も簡単な方法は、文字列を変更する必要があります。 strdup
:ご使用のプラットフォームがそれを持っていない可能性がありますので
char *val = strdup("feels....");
// Do stuff with the string
free(val); // strdup strings need to be freed
strdup
は、POSIXの機能ではなく、Cの標準機能です。しかし、あなた自身で実装するのは簡単です。
char* myStrDup(const char* thingToDup)
{
char* ret = malloc(strlen(thingToDup) + 1); // strlen returns the length without the terminating nul. Hence add 1 to it to allocate
strcpy(ret, thingToDup); // Copies the entire string including the terminating nul.
return ret;
}
書き込み '無料(val)で、!'代わり –
あなたが示したコードでは、あなたが*ない*あなたが*漏れや*未定義の動作につながる、*どこかにポイントするポインタを再割り当てすることができます*ポインタを['free'](http://en.cppreference.com/w/c/memory/free)*関数*に渡します。割り当てられたメモリに文字列を含めるには、[* copy * it](http://en.cppreference.com/w/cpp/string/byte/strcpy)が必要です。文字列にはターミネータに余分な文字が必要なので、12文字の文字列には13のスペースが必要です。 –
また、 ''は古いヘッダーファイルであるため、 'malloc'と' free'関数に '' 。 –