이중포인터에 관하여

조진호·2023년 4월 7일
0
int main(void) {
	char* canvas = nullptr;
	int canvas_size = 80;

	canvas_init(canvas, canvas_size);
}

main 함수가 위와 같이 char형 canvas 포인터를 초기화 한 상태에서 canvas_init 함수를 다음과 같이 설정하면 안된다.

void canvas_init(char* canvas, int canvas_size) {
	char* p = (char*)malloc(sizeof(char) * (canvas_size + 1));
	canvas = p;
}

위 코드를 단계별로 살펴본다면
1. 포인터 매개변수 canvas 생성
2. 포인터 변수 p 생성
3. 동적할당한 메모리의 주소를 p에 대입
4. canvas에 p의 주소 복사

그러나 위의 과정은 main 함수의 포인터 변수인 canvas에는 아무런 영향을 끼치지 않는다. 위 코드가 가능할 것이라고 생각이 드는건 매개변수의 이름이 main 함수에서의 변수와 같아서이다. 그러니 다음과 같이 코드를 바꿔 보겠다.

void canvas_init(char* param, int canvas_size) {
	char* p = (char*)malloc(sizeof(char) * (canvas_size + 1));
	param = p;
}

이렇게 보니 param은 단순한 지역 변수에 불과해 함수가 종료되면 같이 소멸되는 것을 알 수 있다. 위 코드는 main 함수의 변수를 초기화 시키지 못할 뿐더러 동적할당한 메모리 주소를 잃어 메모리 누수(memory leak)현상을 유발할 수 있다. 따라서 canvas를 동적할당한 메모리의 주소로 초기화 하고 싶다면 다음과 같은 방법을 취해야 한다.

void canvas_init(char** canvas, int canvas_size) {
	char* p = (char*)malloc(sizeof(char) * (canvas_size + 1));
	*canvas = p;
}

char** canvas란 이중포인터를 매개변수로 선언하여 main함수에서 nullptr을 가리키는 canvas를 가리켜야 한다. 그 후 동적할당한 메모리의 주소를 복사한 p가 *canvas에게 동적할당된 메모리 주소를 넘겨준다.

이중포인터를 이해하는데 이 사이트가 도움이 되었다.
https://blog.naver.com/kkndsta/220554084946

또 다른 방식으로는 아예 동적할당된 배열을 반환하는 방식이다. 코드는 다음과 같다.

char* canvas_init(int canvas_size) {
	char* canvas = (char*)malloc(sizeof(char) * (canvas_size+1));
	return canvas;
}

c++에서의 레퍼런스를 이용하면 다음과 같이 canvas에 p를 복사할때 '*' 를 붙일 필요 없다.

void canvas_init(char*& canvas, int canvas_size) {
	char* p = (char*)malloc(sizeof(char) * (canvas_size + 1));
	canvas = p;
}
profile
코린이

0개의 댓글

관련 채용 정보