프로그래밍/C/C++
포인터 넘길 때 주의사항(malloc 예제)
엘레멘탈키스
2015. 2. 17. 13:23
1. 예제
user_malloc 함수를 통해 num의 포인터를 넘겨
함수에서 동적할당하여 메모리를 확보한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> #include <stdlib.h> void user_malloc(num); void main() { int* num = 0; user_malloc(num); *num = 8; printf("%d\n", *num); printf("%#p\n", num); printf("%p\n", num); } void user_malloc(int* m_num) { m_num = malloc(sizeof(int*)); } | cs |
하지만 이렇게 하면 오류가...
일단 함수 내부에선 m_num이 메모리 확보가 잘 된다.
하지만 num이 메모리가 확보가 안된다?
함수 안과 밖에서 num은 전혀 초기화 되지 않는다.
결국 *num = 8; 에서 오류가 생긴다.
2. 더블포인터
더블포인터를 이용해 구성해보았다.
user_malloc에서 포인터 num의 주소값으로 넘겨주고
함수에서는 더블포인터로 이를 받는다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> #include <stdlib.h> void user_malloc(num); void main() { int* num = 0; user_malloc(&num); *num = 8; printf("%d\n", *num); printf("%#p\n", num); printf("%p\n", num); } void user_malloc(int** m_num) { *m_num = malloc(sizeof(int**)); } | cs |
m_num이 더블포인터로 들어왔기때문에 직접적으로 m_num에 접근할 수 있다.
함수식이 끝나면 디버깅 변수창에 num이 초기화 되어있는것을 확인할 수 있다.
3. Call by value vs Call by reference vs Call bt address
포인터로 보내서 이게 주소로 호출하는것 처럼 보이지만
결국 값에의한 호출과 같다.
첫 번째 예제에서 포인터를 넘겼지만 결국 m_num은 복사로 새로 생긴 포인터기때문에
메모리를 할당해줘도 함수가 끝나면 사라지는 건 결국 m_num이다.
그러므로 Heap 영역에 할당된 메모리는 누수가 되는 것.
두 번째 예제에서 더블포인터를 넘겼으므로 *m_num으로 내부를 접근하면
실제 num의 값으로 접근할 수 있다.
4. 다른방법? 반환
728x90
반응형