포인터 배열에서....
글쓴이: lyw1100 / 작성시간: 토, 2003/05/31 - 1:00오후
1 static char *daytab[2] = { 2 {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 3 {0, 31, 29, 31, 30 ,31, 30, 31, 31, 30 ,31, 30, 31} 4 } 5 6 int day_of_year(int year, int month, int day) 7 { 8 int i, leap; 9 10 leap = year%4 == 0 && year%100 != 0 || year%400 == 0; 11 for (i = 1; i < month; i++) 12 day += daytab[leap][i]; 13 return day; 14 } 15 16 void month_day(int year, int yearday, int *pmonth, int *pday) 17 { 18 int i,leap; 19 20 leap = year%4 == 0 && year%100 != 0 || year%400 == 0; 21 for (i = 1; yearday > daytab[leap][i]; i++) 22 yearday -= daytab[leap][i]; 23 *pmonth = i; 24 *pday = yearday; 25 } 26 27 main() 28 { 29 int year, month, day, yearday; 30 int *pmonth, *pday; 31 32 year = 2003; 33 month = 5; 34 day = 31; 35 yearday = day_of_year(year,month,day); 36 month_day(year, yearday, pmonth, pday); 37 printf("%d\t%d\n", *pmonth, *pday); 38 } 39
2번째줄에서 에러가 발생하였거든요..
이중배열에서는 저렇게 대입시켰는데 포인터 배열은 저렇게 하니 안되더군요,,,
그러니까
1 static char daytab[2][13] = { 2 {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 3 {0, 31, 29, 31, 30 ,31, 30, 31, 31, 30 ,31, 30, 31} 4 }
이렇게 하면 컴파일이 되더군요..
이중배열 대신 포인터 배열을 사용하면서 저 값을 대입시키려면 어떻게 해야 하나요??
Forums:
포인터의 배열이란...
포인터의 배열이란 말 그대로 포인터를 여러개 가지고 있는 것 입니다.
int *a[10];
하게 되면 int형 포인터를 10개 가지고 있는 배열을 만들게 되는 것이죠...
각각의 포인터의 경우 다른 배열을 단순히 가리킬 수 있습니다. 따라서
지정하신 방법으로 초기화를 시킬 수 있는 방법은 존재하지 않습니다.
다음과 같이 메모리를 할당해서 값을 대입할 수는 있습니다.
int *a[10];
a[0] = malloc(sizeof(int) * 3);
a[0][0] = 0;
Re: 포인터의 배열이란...
님의 말에 덧붙여서 설명 드리겠습니다. ^^
char* daytab[2];의 선언에서 char* 노드가 2개가 되어지겠죠. 정확하게 말하자면 daytab[0], daytab[1]은 char*로 해당 노드에 들어갈 수 있는 하위 요소는 1개입니다. 하지만 배열에 대해서 선언과 초기화를 동시에 하는 경우에는 보통 대응되는 노드에 초기값을 대입하는 형태를 취하게 됩니다. 따라서 위의 코드에선 어떠한 과정을 거치게 되냐면, 일단 daytab[0]이란 노드를 선언하고 메모리에 할당을 했습니다. 그런데 여기에 값을 할당할려고 하는데 {...}로 정의된 초기값들은 1개의 요소로 이루어져 있지 않은 13개의 요소로 이루어져 있습니다. 그래서 이 값들은 서로 다른 형태[유형]를 지니고 있어 이 연산을 행하지 않게 됩니다. 역시 마찬가지로 , 다음의 {...}도 마찬가지겠죠.
일단 형태가 틀리고[노드의 갯수], 자료형이 틀림으로 인해 해당 연산이 수행되지 않게 됩니다. 보통 gcc에선 오류를 내지 않고 해당 노드의 값을 널로 체워버립니다. g++에선 해당 연산을 오류를 내게 됩니다.
그리고 위의 코드에선 4번째 라인에서 }다음에 ;를 빼먹었습니다.
그럼 전 이만...
댓글 달기