포인터 넘길 때 주의사항(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