플밍

함수에서 다차원 배열의 리턴 본문

프로그래밍/C/C++

함수에서 다차원 배열의 리턴

너구리안주 2013. 8. 27. 05:49

함수에서 1차원 배열을 반환할때에는 단순히 해당 포인터를 반환하면 된다

그러면 2차원 배열을 반환할때는 어떻게 해야할까?

#ads_1

얼핏 아래처럼 하면 될 줄 알았다.

char** func(void){
    static char a[2][10] = {"aaaa", "bbbb"};
    return a;
}

이런 제길 return a; 에서 a가 반환값 형식과 맞지 않는다고 빨간지렁이들이 글자밑에 꾸물꾸물 나타났다 -_-;;

그럼 도대체 어떻게 해야 하는가???

정답은 배열포인터를 사용하면된다.

배열의 주소를 가진 포인터!!

typedef char (*Temp)[10];

Temp func(){
    static char a[][10] = {"aaaa", "bbbb"};
    return a;
}

char (*Temp)[10]

참 해괴한 문법이긴 하다.  얼핏보면 이해가 안되는 문법이다.

왜 이렇게 해괴한 문법을 사용해야만 했을까?

배열포인터와 포인터배열을 구분을 하려다보니 어쩔 수 없었던 모양이다.

즉, 아래의 뜻과 같다.

포인터배열 : *arr[10]  //10개의 포인터를 저장할 수 있는 배열

배열포인터 : (*arr)[10] //10개의 요소를 가진 배열의 주소를 저장할 수 있는 포인터

이와 같이 typedef 로 배열포인터를 정의해 주고 그걸 리턴타입으로 사용하면 된다.

그리고 호출하는 쪽에서도 역시 아래와 같이 배열포인터로 받아야 한다.

char (*arr)[10] = func();

cout << arr[0] << endl;  //aaaa 출력

cout << arr[1] << endl;  //bbbb 출력

이제 2차원 배열도 반환할 수 있다 ^^

#ads_1

하지만! 이것도 귀찮다면 아래와 같이 축약형태로 사용할 수도 있다.

char (*func(void))[10]{
    static char a[][10] = {"aaaa", "bbbb"};
    return a;
}

헐~ 코드량은 줄었지만 더 알아보기 힘들다 ㅠㅠ.

두개의 형태중 이해하기 쉬운쪽으로 사용하면 될것이다.


다음은 이를 이용한 다차원배열을 리턴하는 예제이다

#include <iostream>
#include <conio.h>

using namespace std;

//1차원배열의 반환
char *func(void){
    static char a[10] = "abcdefg";
    return a;
}

//2차원배열의 반환
char (*func2(void))[10]{
    static char a[][10] = {"xxx", "yyy", "zzz"};
    return a;
}

//3차원배열의 반환
char (*func3(void))[4][10]{
    static char a[][4][10] = {
        {"abcd", "efg", "hijk", "lmn"},
        {"aaa", "bbb", "ccc", "ddd"}
    };
    return a;
}

int main(){

    char *arr1 = func();
    cout << arr1 << endl; //abcdefg

    cout << "-------------------" << endl;

    char (*arr2)[10] = func2();
    cout << arr2[0] << endl; //xxx
    cout << arr2[1] << endl; //yyy
    cout << arr2[2] << endl; //zzz

    cout << "-------------------" << endl;

    char (*arr3)[4][10] = func3();
    cout << arr3[0][0] << endl; //abcd
    cout << arr3[1][3] << endl; //ddd

    return 0;

}

※ 참고로 배열을 static으로 선언한 이유는 다 아다시피 함수를 벗어나면 함수내에 지역변수로 선언한 배열이 날아가버리기 때문에 static으로 선언했다.

new 나 malloc으로 배열을 생성해도 되지만 사용후 해제해 주어야 하기 때문에 귀찮다

#ads_1

Comments