강좌 & 팁
이전에 올린 "포인터의 포인터 변수가 왜 필요할까요?" 글이 이해가 안 되나는 말씀이 있어서 조금 더 상세히 말씀 드리겠습니다.
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 ]
[쓰레기 주소] [malloc() 반환 주소]
ptr_val 값만 바꾸었을 뿐 ptr_num의 값은 변경되지 않았습니다.
즉, 4행에 의해 리턴이 되어도 ptr_num의 값은 변경된 적이 없습니다.
다시 말씀 드려 malloc()에 의해 생셩된 주소가 ptr_val에 대입되어도
ptr_num에까지 대입되지 않았다는 것이죠.
그러므로 8행의 pritnf()는 아직 쓰레기 값을 가지고 있는 ptr_num의 값을 출력하므로
때에 따라서는 실행 오류가 발생하게 됩니다.