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를 호출한 후에는 메모리가 덮어쓰여지거나 운영 체제에 반환될 수 있습니다.
올바른 접근법:
Node* curr = head; while (curr) { Node* next = curr->next; free(curr); curr = next; }
next를 저장하지 않으면 이미 해제된(및 잠재적으로 본인의 것이 아닌!) 메모리에 대한 접근이 발생합니다.
역사