이전에 올린 "포인터의 포인터 변수가 왜 필요할까요?" 글이 이해가 안 되나는 말씀이 있어서 조금 더 상세히 말씀 드리겠습니다.


1..... void get_value( int *ptr_val){

2.....    *ptr_val = 100;

3..... }


4..... int main( void){

5.....    int num = 0;

6.....     int *ptr_num = #


7.....     get_value( ptr_num);

8.....     printf( "num= %d\n", num);


9.....     return 0;

10.... }


먼저 옳은 샘플입니다. 6행의 int *ptr_num은 포인터 변수를 선언했으므로 아래와 같이 ptr_num 변수를 만들고

변수 값으로 num 주소 값을 넣었습니다.


[  ptr_num   ]
[num 주소값]


1행의 int  ptr_val도 변수 선언이니 ptr_val 이라는 포인터 변수가 생성됩니다. 그리고 ptr_num의 값, 즉 num 주소값을

전달했으므로 ptr_val에는 num 주소값을 갖게 됩니다. 즉, 아래와 같죠.


[   ptr_val    ]

[num 주소값]


그러므로 ptr_num이나 ptr_val 모두 num의 주소값을 가지게 되며 포인터 변수가 가르키는 주소에 값을 대입하면

num 변수 값이 변경됩니다.


그러나 두 번째 샘플은 내용이 다릅니다. 즉, ptr_num이나 ptr_val은 모두 값은 주소값을 갖습니다.


[   ptr_num  ]             [   ptr_val    ]
[num 주소값]             [num 주소값]



1..... void get_value( int *ptr_val){


2.....     ptr_value = malloc( sizeof( int));

3.....    *ptr_val = 100;

4..... }


5..... int main( void){

6.....     int *ptr_num;


7.....     get_value( ptr_num);

8.....     printf( "num= %d\n", *ptr_num);


9.....     return 0;

10.... }


6행의 ptr_num은 포인터 변수만 선언했습니다. 그러므로 ptr_num이 가지고 있는 값은 임의의 쓰레기 값입니다.


[  ptr_num   ]
[쓰레기 주소]


1행 get_value() 함수가 호출되면 ptr_val 변수에 ptr_num의 쓰레기 값이 전달됩니다.


[  ptr_val     ]
[쓰레기 주소]


그러나 2행에서 malloc() 이 호출되고 반환 값이 대입도비니다.


[        ptr_val         ]

[malloc() 반환 주소]


자, 여기서 중요합니다. 그렇다면 ptr_num의 값과 ptr_val의 값은 같을까요? 아니죠. 


[  ptr_num   ]             [        ptr_val         ]
[쓰레기 주소]             [malloc() 반환 주소]


ptr_val 값만 바꾸었을 뿐 ptr_num의 값은 변경되지 않았습니다.

즉, 4행에 의해 리턴이 되어도 ptr_num의 값은 변경된 적이 없습니다.

다시 말씀 드려 malloc()에 의해 생셩된 주소가 ptr_val에 대입되어도

ptr_num에까지 대입되지 않았다는 것이죠.


그러므로 8행의 pritnf()는 아직 쓰레기 값을 가지고 있는 ptr_num의 값을 출력하므로

때에 따라서는 실행 오류가 발생하게 됩니다.