// 노드 구조체 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번째 경우)를 알려주셨다.
오늘은 그 내용을 정리해보았다.