malloc에 대해 되짚어보자.

malloc함수는 heap 영역에 메모리를 할당하는 함수이다. memory allocation의 약어임.

만약 heap에 int 자료형 4칸을 할당하고자 한다면

int *p = (int*)malloc(sizeof(int) * 4);

이런식으로 할당할것임. heap에 int 사이즈 4칸을 할당하고, int형 포인터 변수로 해당 주소를 가리키는 것을 확인할 수 있다.

밑 글에서 사용하는 NODE*. 얘를 그대로 int에 치환해보면 똑같은 방식으로 작동한다는 것을 직관적으로 확인할 수 있다.


NODE **p = (NODE**)malloc(sizeof(NODE*) * length);


그리고 서브루틴에서 받는 매개변수는 call by value로 값을 전달하는데, 넘겨준 값 원본을 변경할 수가 없는건 잘 알고 있을것임.

결국 포인터로 넘겨주는건 주소값을 넘겨주는건데, 주소값 자체도 값이라 서브루틴 내부에서 해당 원본 주소값은 변경할 수가 없다.ㅋ


void func(int*); 형태의 함수가 있다고 하자. int a를 선언하고 int *p가 a의 주소를 담고있음. func에 매개변수로 p를 넘겨주면, p를 이용해서 a의 값을 변경할 수는 있지만 서브루틴에서의 작업이 끝난 후 p가 a 이외에 b, c를 가리키게 하는건 불가능하다. 그걸 가능하게 하려면 func(int**) 형태로 선언한 후, p의 주소값을 넘겨줄 수 밖에.ㅎㅎ

결국 네가 NODE* head를 서브루틴 내부에서 변경하고 싶다면, head의 주소값을 전달해줘야 하기 때문에

매개변수는 NODE**형이 될테고, 호출시 매개변수에는 &head로 넣어야겠지.