문서 스크랩+번역

[스크랩] C, C++에서 함수 인자로 동적할당 할 포인터 변수 활용

https://igotit.tistory.com/entry/C-함수-인자로-포인터-전달하고-함수내에서-동적-메모리-할당-받기-2가지-방식

 

C++. 함수 인자로 포인터 전달하고 함수내에서 동적 메모리 할당 받기 2가지 방식. ** *&

문제 정의. 통상적인 동적 메모리 할당은 아래와 같다. CMyClass * p_myclass = new CMyClass(); 그런데, 위와 달리 포인터변수 선언만 하고, 동적할당은 별도의 함수에서 하고 싶다고 하자. 즉, 아래 코드

igotit.tistory.com

 

cpp 개발중에, 동적할당시에 크기를 정하여 선언 후 사용하는 변수가 있는데

함수화 과정중에 해당 변수를 함수 바깥에서도 사용해야 할 경우가 생겼다. 

 

기존에 함수내에서 변수 선언과 동적할당을 동시에 했다면

바꾼 다음에는 함수 바깥에서 변수를 따로 선언하고, 변수에 할당될 메모리의 크기는 함수 내에서 정해줘야 하는 것. 

 

 

void func1(){
	char* tmp = 0 ;
    func2 (tmp);
    cout << tmp ;
    delete[] tmp;
}

void func2(char* tmp){
	~~~
    tmp = new char[len+1]{'\0',};
    for (int j = 0; j != Len; j++) {
		temp = (BYTE)vget((NameAddr + 2 + j));
		memcpy(tmp + j, &temp, 1);
	}
    ~~~
}

막연하게 생각나는대로 포인터를 사용해 함수를 만들어봤지만 제대로 동작하지는 않았다. 

함수 내에서 문자열의 길이를 동적으로 지정해야 하기 때문에 위와 같은 형태의 코드가 필요했다. 

 

이러한 경우엔 함수 인자로 선언한 포인터변수 자체를 넘기는게 아니고, 포인터 변수의 주소값을 인자로 넘겨 활용해야 올바르게 참조가 된다. 

void func1(){
	char* tmp = 0 ;
    func2 (&tmp);
    cout << tmp ;
    delete[] tmp;
}

void func2(char** tmp){
	~~~
    *tmp = new char[len+1]{'\0',};
    for (int j = 0; j != Len; j++) {
		temp = (BYTE)vget((a + 2 + j));
		memcpy(*tmp + j, &temp, 1);
	}
    ~~~
}

달라져야 하는 부분은 

1. func2 함수의 인자로 tmp 변수의 주소값을 넘겨야함. (&tmp)

2. func2 함수 선언시 인자의 자료형을 이중포인터로 선언해야함. (char **tmp)

3. func2 함수 내에서 해당 변수 사용시 tmp변수 자체가 아닌, tmp 변수의 포인터를 참조하여 사용해야 함. (*tmp)

 

다만 기존 func1 함수 내에서는 tmp 변수를 그대로 사용하면 되는데, 이미 포인터형 변수로 선언되었기 때문에 별다른 참조자를 사용하지 않아도 해당 변수 사용시에 들어있는 값의 메모리 제일 앞 번지를 참조하기 때문. 

그래서 cout 과  delete 시에 참조자 없이 tmp 를 그대로 사용할 수 있다. 

 

좋은 정보를 얻어간것 같다.