포인터 배열에서....

lyw1100의 이미지

      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 }

이렇게 하면 컴파일이 되더군요..

이중배열 대신 포인터 배열을 사용하면서 저 값을 대입시키려면 어떻게 해야 하나요??

Genie의 이미지

포인터의 배열이란 말 그대로 포인터를 여러개 가지고 있는 것 입니다.

int *a[10];

하게 되면 int형 포인터를 10개 가지고 있는 배열을 만들게 되는 것이죠...
각각의 포인터의 경우 다른 배열을 단순히 가리킬 수 있습니다. 따라서
지정하신 방법으로 초기화를 시킬 수 있는 방법은 존재하지 않습니다.
다음과 같이 메모리를 할당해서 값을 대입할 수는 있습니다.

int *a[10];
a[0] = malloc(sizeof(int) * 3);
a[0][0] = 0;

verena의 이미지

Genie wrote:
포인터의 배열이란 말 그대로 포인터를 여러개 가지고 있는 것 입니다.

int *a[10];

하게 되면 int형 포인터를 10개 가지고 있는 배열을 만들게 되는 것이죠...
각각의 포인터의 경우 다른 배열을 단순히 가리킬 수 있습니다. 따라서
지정하신 방법으로 초기화를 시킬 수 있는 방법은 존재하지 않습니다.
다음과 같이 메모리를 할당해서 값을 대입할 수는 있습니다.

int *a[10];
a[0] = malloc(sizeof(int) * 3);
a[0][0] = 0;

님의 말에 덧붙여서 설명 드리겠습니다. ^^

char* daytab[2];의 선언에서 char* 노드가 2개가 되어지겠죠. 정확하게 말하자면 daytab[0], daytab[1]은 char*로 해당 노드에 들어갈 수 있는 하위 요소는 1개입니다. 하지만 배열에 대해서 선언과 초기화를 동시에 하는 경우에는 보통 대응되는 노드에 초기값을 대입하는 형태를 취하게 됩니다. 따라서 위의 코드에선 어떠한 과정을 거치게 되냐면, 일단 daytab[0]이란 노드를 선언하고 메모리에 할당을 했습니다. 그런데 여기에 값을 할당할려고 하는데 {...}로 정의된 초기값들은 1개의 요소로 이루어져 있지 않은 13개의 요소로 이루어져 있습니다. 그래서 이 값들은 서로 다른 형태[유형]를 지니고 있어 이 연산을 행하지 않게 됩니다. 역시 마찬가지로 , 다음의 {...}도 마찬가지겠죠.

일단 형태가 틀리고[노드의 갯수], 자료형이 틀림으로 인해 해당 연산이 수행되지 않게 됩니다. 보통 gcc에선 오류를 내지 않고 해당 노드의 값을 널로 체워버립니다. g++에선 해당 연산을 오류를 내게 됩니다.

그리고 위의 코드에선 4번째 라인에서 }다음에 ;를 빼먹었습니다.

그럼 전 이만...