|
아~ 저도 무진장 고민해봤습니다...
어떻게 될꺼 같아서요...
결론은 방법을 못찾겠습니다.
일단 다차원(여기선 2차원)배열을 주고 받는 방법은 2가지가 있습니다.
아래 1번과 2번이요.
제가 이해한 C++학생님의 의도는 Add함수에서 temp(2차원배열)를 잡아서
그 주소를 main으로 가져와서 temp를 엑세스 하실려는거 같습니다.
int temp[2][2] = Add(a, b);
이 부분이 2차원 배열의 주소를 받기위해서 쓰신거 같은데 조금 틀린 표현입니다.
여기서 temp는 const변수라서 값을 할당 할 수가 없습니다.
이미 스택영역에 2행 2열의 배열을 가르키고 있기 때문에 그 영역이외에는 가르킬수가 없습니다.
그리고 함수내에서 선언해준거니까 static영역에 잡아서 함수가 종료되도 temp가
남아 있게 하신거구요...
이해를 제대로 했는지는 모르겠지만 전 이렇게 생각하니까 꼭 될꺼 같아서
이래저래 해봐도 답이 안나오네요.
첫번째 문제는 함수의 리턴형에 열의 개수가 몇개인(여기선 2개) 다차원 배열을 리턴하겠다는
표현을 어떻게도 할수가 없었습니다.
두번째는 staitc변수는 프로그램이 끝날때 까지 살아남아 있지만 그 사용범위는
선언된 블럭내라고 합니다.
책의 표현을 빌자면 생존성은 전역인데 가시권이 지역이라는군요.
그래도 내가 주소를 가져와서 엑세스 하겠다는데 왜 안되는지 저도 이부분에서
될꺼같아서 해봤는데 힘드네요...
엑세스 방법을 제공 하지 않는것인지 할수가 없어서 방법이 없는것인지 저도 궁금하네요...
아래 1번은 main에서 temp를 스택영역에 잡고 그 주소를 전달해서 Add함수가 값을 채운거구요
2번은 Add함수가 힙영역에 temp를 잡아서 값을 채우고 그 주소를 main으로 전달 하는겁니다.
main에서 스택영역에 만든 변수는 main이 끝나야 없어지니까 계속 유지되구요
Add함수가 힙영역에 만든 변수는 free를 해야 없어지니까 그 전까지는 계속 유지됩니다.
1번
void Add(int (*x)[2], int (*y)[2], int (*temp)[2])
{
int i, j;
for(i=0; i<2; i++)
for(j=0; j<2; j++)
temp[i][j] = x[i][j] + y[i][j];
}
void main(void)
{
int a[2][2] = {{1, 2}, {3 ,4}};
int b[2][2] = {{2, 3}, {4, 5}};
int temp[2][2];
Add(a, b, temp);
printf("%d %d\n", temp[0][0], temp[0][1]);
printf("%d %d", temp[1][0], temp[1][1]);
}
2번
int** Add(int (*x)[2], int (*y)[2])
{
int i, j;
int **temp;
int row = 2, col = 2;
temp = (int**)malloc(sizeof(int*) * row);
for(i=0; i<row; i++)
*(temp+i) = (int*)malloc(sizeof(int) * col);
for(i=0; i<row; i++)
for(j=0; j<col; j++)
temp[i][j] = x[i][j] + y[i][j];
return temp;
}
void free_Add(int** temp)
{
int i;
for(i=0; i<2; i++)
{
free(*(temp+i));
*(temp+i) = NULL;
}
free(temp);
temp = NULL;
}
void main(void)
{
int a[2][2] = {{1, 2}, {3 ,4}};
int b[2][2] = {{2, 3}, {4, 5}};
int **temp;
temp = Add(a, b);
printf("%d %d\n", temp[0][0], temp[0][1]);
printf("%d %d", temp[1][0], temp[1][1]);
free_Add(temp);
}
|