포인터 넘길 때 주의사항(malloc 예제)
2015. 2. 17. 13:23ㆍ프로그래밍/C/C++
728x90
728x90
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
반응형
'프로그래밍 > C/C++' 카테고리의 다른 글
[c++] main함수의 인자 argc, argv (0) | 2015.03.07 |
---|---|
부동소수점과 예시 (4) | 2015.03.06 |
C와 C++의 차이점 (0) | 2015.02.23 |
기호 이름 읽는 법 (0) | 2015.02.18 |
printf 서식 종류와 출력 (0) | 2015.02.17 |
비주얼 스튜디오에서 가비지 값은 왜 같은가? (0) | 2015.02.15 |
printf 서식 정렬 (0) | 2015.02.05 |