먼저 대학에서 현제 자료구조 수업을 수강하고 있는 대학생이라 

지식의 깊이가 부족할 수 있음을 양해 드림.


난 지금 학교에서 자료구조 수업을 듣고 있는 대학생이야.(2학년)

학교 수업 교재부터 윤성x의 열x 자료구x 같은 책을 보면

포인터를 초기화 시키는 함수를 만들어 놓고 

밖에서 동적할당을 하고 해당 포인터를 초기화 함수의 실인자로 집어넣는것을 볼 수 있는데

초기화 함수를 만들어 놓고도 메모리 할당과 메모리에 값쓰는걸 따로 하는것은 꽤 별로지


사실 이는 이중포인터를 쓰면 쉽게 해결할 수 있는 경우야

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
typedef struct node{
int data;
struct node* next;
}node;
 
void init_list(node** sentinel){
*sentinel = (node*)malloc(sizeof(node));
(*sentinel) -> data  = 0;
(*sentinel) -> next = NULL;
}
 
void single_init_list(node* sentinel){
    //sentinel = (node*)malloc(sizeof(node)); 
    //동적할당을 미리 다른 함수에서 해놓아야함
    sentinel -> data = 0;
    sentinel -> next = NULL;
}
 
 
int main(int argc, char* argv){
    node* single_test = (node*)malloc(sizeof(node));
    single_init_list(single_test);
    node* double_test;
    init_list(&double_test);
}
cs

코드를 예로 좀 들어볼께 non-circular 단순 연결리스트와 

그에 해당하는 node를 예로 들어볼께



이중 포인터를 사용하는 함수 init_list 와 

그냥 포인터를 사용하는 함수 single_init_list가 있어

먼저 main함수를 보자

이중 포인터를 사용하면 double_test라는 포인터를 선언하고

그 주소를 한번에 초기화 함수의 파라미터로 넘길 수 있지?

근데 single_test부분을 봐 먼저 동적할당을 해준 이후에 

single_init_list함수에 인자로 넘기는 것을 볼 수 있어.

동적할당을 해줘야만 함수인자로 넘겨서 

함수에서 포인터에 관련된 여러 연산을 수행하기 때문이지


여기서 질문

왜 single 포인터를 사용할떄는 동적할당을 꼭 해줘야 할까?

왜냐하면 싱글포인터의 경우에는 처음에 초기화 없이 선언하면 쓰레기 값을 가지겠지?

초기화 안한 변수는(포인터도 변수니까) 함수에 파라미터로 넘겨주면 안되잖아? 

쓰레기 값이 들어 있을테니 (여기선 포인터니까 어떤 메모리 주소를 가리킬지 모르잖아)

그래서 main함수에서 동적할당을 따로 하고 넘겨줘야되


이제 double_test를 볼까?

double_test도 single_test와 마찬가지로 single 포인터로 선언을 했어.

double_test의 사용을 보면 초기화 없이 주소값만(포인터 자체의 주소값만 포인터가 가리키는 주소값 아님!)

넘기는것을 볼 수 있지?

그러면 init_test함수에선 포인터 자체의 주소를받아와서 역참조를 통해서 동적할당을 해주고 있어.

여기선 왜 초기화도 안해줬는데 문제 없이 동작할까?

그 이유는 double_test를 선언할때 double_test자체의 주소는 쓰레기값이 들어가는게 아니라 

프로세스가 실행된 이후에 배정된 메모리 공간에 맞게 배정을 받기 때문이야 (지역변수랑 마찬가지야!)

그러니까 double_test의 주소를 참조해서 double_test에 대해서 동적으로 메모리공간을 할당해줘도

문제가 없는거야


이렇게 짜면 뭐가 좋을까?

자료구조를 짜는데 더욱더 일반적으로 짤수가 있어

어짜피 초기화를 하는데 할당이랑 데이터 초기화랑 분리하는것보단

한번에 하는것이 깔끔하지. 

학교에서 수업하는 교수님도 아무 말씀 없으시고

주변에 같이 공부하는 친구들한테도 말해봐도 잘 모르는경우가 태반이라

혹시 지금 C나 자료구조 배우고 있는 갤러들있으면 조금이나마 도움되라고

내가 공부하다가든 생각 적어봤어 ㅎㅎ