본문 바로가기

C++

[C++] 매개변수로 이중포인터를 사용해야 할 경우

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에 접근 할 수 있다.