2016-04-15 10 views
0

malloc()で割り当てられたベクトルから割り当てたポインタを解放しようとしていますが、最初の要素(index [0])を削除しようとすると、私はこのエラーが発生した秒([1]インデックス)を削除します。C - 解放されているポインタが割り当てられていない

malloc: *** error for object 0x100200218: pointer being freed was not allocated 

コード:

table->t = malloc (sizeof (entry) * tam); 
entry * elem = &table->t[1]; 
free(elem); 

答えて

11

はあなたが唯一の呼び出し(またはする必要があります)malloc()や家族によって返されたポインタにfree()をすることができます。あなたのケースでは

C11を引用し、章§7.22.3.3

[...] Otherwise, if the argument does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to free or realloc , the behavior is undefined.

table->t(または、&table->t[0]は)そのポインタではなく、&table->t[1]です。 free()table->tを-ing、言っ

全体メモリブロックを解放し、あなたは個別に/部分的に自由(むしろ、することはできません)する必要はありません。詳細はthis answerを参照してください。

+2

学習にコミットしている場合は、慎重に検討すべきCプログラミングや地域の主な頭痛の種である算術演算を、ポインタへの糖衣構文をしているされていないかもしれません'&table-> t [0]'は 'table-> t'と等価であるため、自由に動作するようにしてください。 – Siguza

3

&卓上> T [0]卓上> Tに等しいので、それは最初の要素上で動作。これは、最初の要素が(配列の定義によって)配列そのものと同じアドレスを持つためです。 配列自体には割り当てられたアドレスがあるため、そのアドレスだけを解放することができます。

1

malloc()は、使用可能なサイズが渡された単一の整数パラメータである単一の連続したメモリ領域を割り当てて動作します。割り当てられた領域のポインタを返します。

戻されたポインタは、そのポインタの一部ではなく、一度だけ解放できます。

配列はCのオブジェクトは、彼らはおそらくあなたがC.

関連する問題