공부(IT)/c

[c]2차배열을 함수에서 리턴받기

Dohyun Kim 2016. 2. 10. 01:02

1.소스코드

---------------------------------------------------

#include <stdio.h>

int(* initArray())[4] {

static int arr[4][4] = { 0 };

for (int i = 0; i < 16; i++)

*(arr[0] + i) = i + 1;

return arr;

}


int main() {


//int** arr = initArray();

int(* arr)[4] = initArray();


for (int i = 0; i < 4; i++)

for (int j = 0; j < 4; j++)

printf("%d", arr[i][j]);

return 0;

}

----------------------------------------------------------------------

- 3번줄에서 static으로 선언하지않으면 만들어놓은 배열 자체가 증발해버려서 괜히 헛메모리만 하나 낭비하는꼴이된다.

- 주석처리된부분처럼하면 배열포인터로서 넘겨줘도 그냥 일반 더블포인터로서 취급되서 아래에서처럼 배열로서의 사용이 불가능해진다. 구조상 배열포인터로의 강제승격은 불가능해보인다.



2. 참고자료 (원문 : http://kkikkodev.tistory.com/200)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
 
#define ARR_ROW_SIZE 3
#define ARR_COL_SIZE 4
 
int(*ReturnArray())[ARR_COL_SIZE];
void PrintArray(int(*arr)[ARR_COL_SIZE], int row, int col);
 
int main(int argc, char* argv[]){
    int(*arr)[ARR_COL_SIZE] = ReturnArray();
    PrintArray(arr, ARR_ROW_SIZE, ARR_COL_SIZE);
    return 0;
}
 
int(*ReturnArray())[ARR_COL_SIZE]{
    static int arr[ARR_ROW_SIZE][ARR_COL_SIZE] = {
        { 1, 2, 3, 4 },
        { 5, 6, 7, 8 },
        { 9, 10, 11, 12 }
    };
    return arr;
}
 
void PrintArray(int(*arr)[ARR_COL_SIZE], int row, int col){
    int i;
    int j;
    for (i = 0; i < row; i++){
        for (j = 0; j < col; j++){
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}


6 ~ 7 라인

추후 사용할 함수들의 선언부입니다.


10 라인

int 형 2 차원 배열 포인터를 선언함과 동시에, ReturnArray 함수를 호출하여 받은 반환값으로 초기화하고 있습니다. ReturnArray 함수에서 반환하는 것이, int 형 2 차원 배열 포인터이기 때문에, 같은 형식으로 받아주고 있습니다.


11 라인

int 형 2 차원 배열 포인터와 행 개수, 열 개수를 넘기면서 PrintArray 를 호출하여 화면에 배열 요소들을 모두 출력합니다.


15 라인

ReturnArray 함수의 정의부입니다. 매개변수는 없고, 반환형이 int 형 2 차원 배열 포인터형인 (int (*)[ARR_COL_SIZE]) 이 함수는, 단순히 2 차원 배열을 선언하고, 정수값들로 초기화해서 반환하는 역할을 하고 있습니다.


16 ~ 20 라인

2 차원 배열을 선언함과 동시에 초기화하고 있습니다. 단, 지역 변수로 선언했을 경우에, 반환하면, 스택에서 사라지기 때문에, static 지역변수로 선언하여, 이 함수가 종료되어도, 메모리에 배열이 남아 있도록 하였습니다.


21 라인

선언하고 초기화한 2 차원 배열을 반환하고 있습니다. 이 함수의 반환형은, 2 차원 배열 포인터형이 됩니다.


함수의 반환형이 2 차원 배열 포인터형인 경우에는, 


배열 요소의 자료형(*함수명(매개변수))[배열의 열 개수]{


}


의 형태로 함수의 정의부를 작성합니다. 이 함수를 호출하는 쪽에서도, 마찬가지로 2 차원 배열 포인터형의 변수를 선언하여 반환값을 받아주어야 합니다.


[실행 결과]