포인터 배열에서....

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번째 라인에서 }다음에 ;를 빼먹었습니다.

그럼 전 이만...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.