int a[5];
void func(int[] v);
int b[3][4];
void func(int[][4] v);
int c[7][8][9];
void func(int[][8][9] v);
이런 식으로..
왜냐하면 우선 단 하나의 포인터만으로 배열이 전달되는데요..
v[2][3] = 3;
과 같은 식으로 사용을 하려면 컴파일러가 (2,3)라는 위치가
(0,0)에서 얼마나 떨어진 것이지 알아야 컴파일이 가능하기 때문이지요..
그러니까 함수 머리에서 int[][4]와 같은 식으로
인덱스의 크기가 주어져야
'(2,3)번째 원소는 처음에서 (2*4+3)만큼 떨어져있다'
라고 계산할 수 있는 것입니다.
(row major, column major에 관한 내용도 보시면 좋습니다.)
대신 가장 처음의 인덱스는 없더라도 계산이 가능하기 때문에 생략할 수 있는 것입니다.
하지만 c는 boundary check(경계 검사)를 하지 않기 때문에..
주어진 배열의 크기는 int[3][4]라 하더라도
(6,3)에 접근할 수 있게 됩니다!!
(즉, 뒷부분 인덱스만 범위가 맞다면 가장앞 인덱스는 신경 쓰지 않죠!)
물론 이것은 논리적인 오류이지요.
만약 고정된 크기의 다차원 배열을 사용하신다면..
함수에 넘길 때에도
int a[5];
void func(int[5] v);
int b[3][4];
void func(int[3][4] v);
int c[7][8][9];
void func(int[7][8][9] v);
Re: 이차원 배열을 다른 함수로 넘기기..
void b(char test[][3]); 도 됩니다.
[code:1]#include <stdio.h>vo
음. 했긴 했는데.
왜 b함수에서 char * test로 받는지 이유를 잘 모르겠군요.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
[code:1]int main(){ 8
2차원 배열이라구 해도 1차원 포인터로 할당 되는군요.
이거 gcc 에만 해당 되는지 아는분^^
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
[quote="fehead"]2차원 배열이라구 해도 1차원 포인터로 할당
배열의 특징이 원래 그렇습니다. test[0][0]부터 test[2][3]이 연속적으로 배치되지요.
이 특징을 이용해서 다차원 배열을 1차원 포인터(?)로 넘기는 방법을 쓰기도 합니다.
int test[2][3];과 같은 변수의 할당은 compile ti
int test[2][3];
과 같은 변수의 할당은 compile time에 어레이의 크기와 index가 결정됩니다.
그렇기에 이와같은 변수의 할당이나 함수의파라메터로의 전달은 1차원 이상의 고차원 배열에서 1차원의 어레이로 관리가 됩니다.
하지만, 동적크기의 어레이의 경우에는 compile time에 그 index가 결정될 수 없기 때문에.. "int test[2][3];"와 같은 방법으로 관리되지 않습니다.
WOW Wow!!!
Computer Science is no more about computers than astronomy is about telescopes.
-- E. W. Dijkstra
[code:1]void b(char (*test)&
아니면 이런것도..
To be or not to be.
That is the question.
네 윗분들이 다 말씀해 주셨는데요..한가지 첨언하자면..가장
네 윗분들이 다 말씀해 주셨는데요..
한가지 첨언하자면..
가장 처음의 인덱스만 생략할 수 있습니다..
예를들면..
이런 식으로..
왜냐하면 우선 단 하나의 포인터만으로 배열이 전달되는데요..
v[2][3] = 3;
과 같은 식으로 사용을 하려면 컴파일러가 (2,3)라는 위치가
(0,0)에서 얼마나 떨어진 것이지 알아야 컴파일이 가능하기 때문이지요..
그러니까 함수 머리에서 int[][4]와 같은 식으로
인덱스의 크기가 주어져야
'(2,3)번째 원소는 처음에서 (2*4+3)만큼 떨어져있다'
라고 계산할 수 있는 것입니다.
(row major, column major에 관한 내용도 보시면 좋습니다.)
대신 가장 처음의 인덱스는 없더라도 계산이 가능하기 때문에 생략할 수 있는 것입니다.
하지만 c는 boundary check(경계 검사)를 하지 않기 때문에..
주어진 배열의 크기는 int[3][4]라 하더라도
(6,3)에 접근할 수 있게 됩니다!!
(즉, 뒷부분 인덱스만 범위가 맞다면 가장앞 인덱스는 신경 쓰지 않죠!)
물론 이것은 논리적인 오류이지요.
만약 고정된 크기의 다차원 배열을 사용하신다면..
함수에 넘길 때에도
위와 같이 모든 인덱스를 다 써주시는 것을 추천드립니다.
그러면 컴파일러의 능력에 따라서 최대한 성의것 오류를 알려주겠지요..
ㅡ_ㅡ;
http://www.cinsk.org/cfaqs/html/node8.ht
http://www.cinsk.org/cfaqs/html/node8.html#SECTION00860000000000000000
댓글 달기