다음과 같은 단순 연결리스트 코드가 있다.

#include <stdio.h>
#include <stdlib.h>    // malloc, free 함수가 선언된 헤더 파일

struct NODE {             // 연결 리스트의 노드 구조체
    struct NODE *next;    // 다음 노드의 주소를 저장할 포인터
    int data;             // 데이터를 저장할 멤버
};

int main()
{
    struct NODE *head = malloc(sizeof(struct NODE));    // 머리 노드 생성
                                                        // 머리 노드는 데이터를 저장하지 않음

    struct NODE *node1 = malloc(sizeof(struct NODE));   // 첫 번째 노드 생성
    head->next = node1;                                 // 머리 노드 다음은 첫 번째 노드
    node1->data = 10;                                   // 첫 번째 노드에 10 저장

    struct NODE *node2 = malloc(sizeof(struct NODE));   // 두 번째 노드 생성
    node1->next = node2;                                // 첫 번째 노드 다음은 두 번째 노드
    node2->data = 20;                                   // 두 번째 노드에 20 저장

    node2->next = NULL;                                 // 두 번째 노드 다음은 노드가 없음(NULL)

    struct NODE *curr = head->next;    // 연결 리스트 순회용 포인터에 첫 번째 노드의 주소 저장
    while (curr != NULL)               // 포인터가 NULL이 아닐 때 계속 반복
    {
        printf("%d\\n", curr->data);    // 현재 노드의 데이터 출력
        curr = curr->next;             // 포인터에 다음 노드의 주소 저장
    }

    free(node2);    // 노드 메모리 해제
    free(node1);    // 노드 메모리 해제
    free(head);     // 머리 노드 메모리 해제

    return 0;
}

나의 궁금점..!🧐


도대체 왜..! node 마다 malloc을 해줘야 하는거지..?

#include <stdio.h>
#include <stdlib.h>

struct NODE {
	struct NODE *next;
	int data;
};

int main()
{
	struct NODE head;
	struct NODE node1;
	head.next = &node1;
	node1.data = 1;

	struct NODE node2;
	node1.next = &node2;
	node2.data = 2;

	node2.next = NULL;

	struct NODE *curr = head.next;
	while (curr != NULL)
	{
		printf("%d\\n", curr->data);
		curr = curr->next;
	}

	return (0);
}

이런식으로 해줘도 되는 거 아닌가..!

스스로 생각해본 결과..!🤣


딱 저 상황에서만 보았을때는 문제가 없다.

node1 node2 를 순회하면서 1,2 값을 잘 찍는다.

그렇다면 왜 동적할당을 해주는 것일까?

내가 내린 결론은..새로운 노드를 삽입할때에 그 문제가 나타난다.

우리는 새로운 노드 삽입을 위해서 삽입 함수를 만들게 될 것인데, 새로운 노드를 삽입을 할때에는 기본적으로 새로운 노드를 할당 받아야한다. 즉, 그냥 일반 변수를 사용하게 되면 삽입 함수가 종료 시에 그 변수는 소멸되기 떄문에 새로운 노드가 사라지는 반면, 동적할당을 통해서 주소를 할당 받게 되면 그 함수가 끝이 나더라도 새로운 노드의 주소는 계속 남게 된다.