void allocWithPoint(int* _p)
{
_p = new int(3);
delete_p;
}
int main()
{
int* p = nullptr;
allocWitPoint(p);
cout << *p;
}
위 코드에서 출력값은 뭘까?
3이 출력되지 않고 p가 nullptr라는 오류가 발생한다.
분명 매개변수를 포인터로 받아 동적할당을 하고 가리키는 값을 3으로 초기화하는 함수를 실행했는데도 말이다.
오류가 발생한 이유는 매개변수 _p는 main함수의 p가 아닌 복사된 것이기 때문이다.
call by address의 매개변수는 전달 받은 포인터를 복사한 것이다.
그래서 전달한 포인터 p는 그대로 nullptr 이고 p를 복사한 _p에 동적할당이 되어버린다.
void allocWithDoublePoint(int** _pp)
{
*_pp = new int(3);
}
int main()
{
int* p = nullptr;
allocWithDoublePoint(&p);
cout << *p;
delete p;
}
매개변수를 이중포인터로 받고 p의 주소를 전달했다.
이렇게 하면 _pp는 &p를 복사한 이중포인터지만 *_pp는 p이다. (*(&p) 의 *와&는 상쇄되기 때문)
그래서 이중포인터를 이용하면 함수의 매개변수로 main함수의 p에 접근 할 수 있다.
'C++' 카테고리의 다른 글
| [C++] 클래스명 객체명();는 디폴트 생성자를 호출하지 않는다. (0) | 2023.02.15 |
|---|---|
| [C++] memset으로 배열 초기화 시 0,-1으로만 초기화 가능 (0) | 2023.02.07 |
| [C++] 우선 순위 큐 정렬 방법 변경 (0) | 2023.01.31 |
| [C++] 부동 소수점 (0) | 2023.01.10 |
| [C++] 포인터 비트 단위 이해 (0) | 2022.12.25 |