알고리즘 실습 1 - 배운 점

컴공거북이·2024년 9월 5일

<1. 리스트의 동적, 정적 메모리 할당>

// 노드 구조체
typedef struct _Node
{
    struct _Node *prev;
    struct _Node *next;
    char elem;
} Node;
// 리스트 구조체
typedef struct
{
    Node *header;
    Node *trailer;
    int length;
} List;

위의 코드를 전재했을 때

//1번째 경우 - 오류 발생
List *L;
init(L);

1번째 경우는 List *L;은 포인터 변수를 선언하지만, 메모리를 할당하지 않아서
L은 유효한 메모리 주소를 가리키지 않고 코드는 정상 작동을 하지 않는다.

//2번째 경우 - 정상 작동
List *L = (List *)malloc(sizeof(List));
init(L);

2번째 경우는 List 구조체의 크기만큼 동적 메모리를 할당하여, L은 유효한 메모리 공간을 가리키고 있으므로 코드가 정상적으로 작동한다.

//3번째 경우 - 정상 작동
List L;
init(&L);

이 경우는 정적 메모리에서 할당된 구조체의 주소를 전달하는 방식입니다. 그래서 동적 메모리를 할당할 필요 없이, L이 가리키는 메모리가 이미 할당된 상태이므로 정상적으로 동작한다.

나는 첫 번째 경우로 코드를 짜서 오류가 발생했다.
교수님께 1번째 경우의 오류 이유를 여쭤보았다.
교수님께서는 그 이유와 대안 2가지(2번째 경우, 3번째 경우)를 알려주셨다.
오늘은 그 내용을 정리해보았다.

profile
잘못된 정보가 있을 경우 언제든 댓글로 남겨주세요 :) 감사합니다!!

0개의 댓글