C/C++에서 함수 내부에 선언된 로컬 배열(지역 배열)은 함수가 종료되는 순간 스택에서 해제되기 때문에, 그대로 반환하면 유효하지 않은 메모리를 가리키게 됩니다. 이 문제를 해결하는 대표적인 방법은 동적 할당(dynamic allocation)을 사용하는 것입니다.
아래는 동적으로 할당된 배열을 함수에서 반환하는 C++ 프로그램 예제입니다.
알고리즘
시작 함수 Array()에서 로컬 배열을 반환하기 위해 동적으로 할당된 배열(new 연산자)을 사용한다. 배열의 요소들을 출력한다. 끝
예제 코드
#include <iostream>
using namespace std;
int* Array() {
int* a = new int[100];
a[0] = 7;
a[1] = 6;
a[2] = 4;
a[3] = 5;
return a;
}
int main() {
int* p = Array();
cout << "The elements are:" << p[0] << " " << p[1] << " " << p[2] << " " << p[3];
return 0;
}실행 결과
The elements are:7 6 4 5
코드 설명
Array() 함수 내부에서 new int[100]을 통해 힙(heap) 영역에 배열을 생성합니다. 힙에 할당된 메모리는 함수가 종료되어도 자동으로 해제되지 않으므로, 함수가 끝난 후에도 안전하게 포인터로 접근할 수 있습니다.
주의사항
- 메모리 누수 방지:
new로 할당한 배열은 사용이 끝나면 반드시delete[] p;로 해제해야 합니다. - 대안 방법: 호출자가 배열을 인자로 전달받아 채우는 방식,
static 배열 사용, 또는 C++에서는std::vector나std::array를 반환하는 것이 더 안전하고 권장되는 방법입니다.
동적 할당 방식은 간단하지만 메모리 관리 책임이 프로그래머에게 있으므로, 실무에서는 스마트 포인터(std::unique_ptr<int[]>)나 STL 컨테이너를 활용하는 것이 좋습니다.