次のコードについて混乱しています。Cポインタ解放について混乱しました
私は:
char *a = malloc(10);
char *c = a;
free(c);
これは、Cポインタそのものや、それが指しているアドレスを解放しますか? (これはmallocedアドレスです)。
または、ポインタを解放して、割り当てられたアドレスだけを残しますか?
次のコードについて混乱しています。Cポインタ解放について混乱しました
私は:
char *a = malloc(10);
char *c = a;
free(c);
これは、Cポインタそのものや、それが指しているアドレスを解放しますか? (これはmallocedアドレスです)。
または、ポインタを解放して、割り当てられたアドレスだけを残しますか?
アドレスが指しているアドレスを解放します。あなたはまだポインタ 'c'を使用することができますが、それは危険であり、決して実行しないでください。
この例では、mallocされたメモリを解放しますか?右? –
@Ali Kurabiyeciはい。ポインタはローカル変数です。 「破棄」できる唯一の方法は、定義した場所に関数を残した後です。 –
あなたは決して住所を解放しません。オブジェクトを解放した後のポインタの値を使用すると、未定義のビヘイビアが呼び出されます。 **これは単に「危険」ではなく、単に違法です**。 – Olaf
「ポインタを解放する」ことは決してありません。これはまったくまったくばかばかしいことです。新しいユーザーは、他の厄介な元の新規ユーザーから簡単にすべてを拾い上げ、本当に疑問に思うことはありません。
メモリを割り当て、メモリを解放します。あなたがそのメモリについて語る方法は、それを指すポインタですが、メモリはリソースであり、メモリを記述するポインタではありません。
あなたは、ポインタを介して、メモリについて話しているので、ポインタが何malloc
戻り、何free
要しており、解放関数は「自由」動詞のように呼ばれ、メモリ解放関数がポインタを取るされているので、それがダウン簡単失策です滑りやすい斜面で「ポインタを自由にする」ことを話し始める。それは "ポインタを所有している"と言っても同じような誤解です。本当に所有されているものは、リソースの責任です。
あなたは自分の場所をmallocedしている場合は、ポインタを解放することができます(しかし、私は今夜はおかしいと思います:)。 – ThingyWotsit
@ ThingyWotsitあなたは助けていない:少なくとも私はポイント感謝の男を得る –
@ThingyWotsit:厄介なニットピッカーの仕事はすでに取られている。しかし、あなたは正しいです:-) – Olaf
**ポインタ**を解放しないでください!そしてあなたは決して住所を自由にすることはありません。 – Olaf
[実際のポインタのコピーでfree()を使用すると合格/正解となりますか?](http://stackoverflow.com/questions/43456215/using-free-on-a-copy-of-the-actual) -pointer-acceptable-correct) –