C言語における動的データ構造(例えば、連結リストやツリー)は、通常、ポインタと動的メモリ確保(malloc、calloc、free)を使って手動で実装されます。
typedef struct Node { int value; struct Node* next; } Node; Node* create_node(int value) { Node* n = malloc(sizeof(Node)); if (!n) return NULL; n->value = value; n->next = NULL; return n; } void free_list(Node* head) { while (head) { Node* tmp = head; head = head->next; free(tmp); } }
リストをループ内で、現在のポインタだけを使ってノードのメモリを解放できますか?
前もって次のノードを保存せずに現在のノードを解放することはできません!freeを呼び出した後、アドレスのメモリは上書きされるか、OSに返される可能性があります。
正しいアプローチ:
Node* curr = head; while (curr) { Node* next = curr->next; free(curr); curr = next; }
nextを保存しないと、既に解放された(そしておそらく他のプログラムの!)メモリにアクセスすることになります。
ストーリー