C함수 호출에서 배열을 인자로 넘길때 궁금한게 있는데요...

madtag의 이미지

void test(int a[10], int b[40])
{
        int i;

        for (i=0; i<10; i++)
                printf("%d\t%d\n", a[i], b[i]);
}

int main()
{
        int a[10], b[10], i;

        for (i=0; i<10; i++)
        {
                a[i] = i;
                b[i] = i*2;
        }

        test(a, b);
        return 0;
}

여기서 함수를 test의 두번째 인자를 배열 길이 40을 받도록 했는데

호출할때 길이 10이 선언된 것을 호출하면 아무런 에러 메세지도 없고...

잘 실행이되는데요...

그 이유가 모죠?[/code]

icmplayer의 이미지

배열을 넘길뗀 포인터로 넘기죠.
안 그럴 경우의 오버해드를 생각해 보세요 (진짜 memcpy...)
test(...) 안에서 sizeof(a) (b도) 출력해 보시면 main(...) 안에서 한 것과 다르게 나올 겁니다.
main에선 10 * sizeof(int) = 40 겠죠 (32 bit기준).
test에선 4, 측 sizeof(int)죠.
--> void test(int *a, int *b) { ...}

그리고 for (...) 에선 ++i 를 쓰시는게 i++ 보다 낮습니다.
그럼 열심히 c 공부 하시길.

sealover의 이미지

배열이 넘어가는게 아니고 포인터가 넘어가지요...

좀 바꿔서 실험해보면.... (디버거로 보면 더 학씰하지요... ^^)

void test(int a[10], int b[40])
{
    int i;  

    for (i=0; i<10; i++)
        printf("%d\t%d\n", a[i], b[i]);

    for (i=10; i<20; i++)
        printf("\t%d\n", b[i]);

    printf("%d\n", a[11]); 
    printf("%d\n", b[-1]); 
}

int main()
{
    int xxx;
    int a[10], b[10];
    int xx; 
    int i;  

    xxx = 99999;
    xx = 88888;

    for (i=0; i<10; i++)
    {
        a[i] = i;
        b[i] = i*2;
    }

    test(a, b);
    return 0;
}

결과

0       0
1       2
2       4
3       6
4       8
5       10
6       12
7       14
8       16
9       18
        0
        1
        2
        3
        4
        5
        6
        7
        8
        9
99999
88888
xyhan의 이미지

C에서 매개변수로 배열을 넘길수가
없습미다...

a,b는 배열의 이름입미다..

a[i],b[i]

위 배열의 이름 a,b는 그 배열의 첫번째 인자를
가르키는 포인터 입미다..

============================================================

선한 인간이냐 악한 인간이냐는 그사람의 의지에 달렸다. -에픽테토스-
의지 노력 기다림은 성공의 주춧돌이다. -파스퇴르-

============================================================

garuna의 이미지

C 는 인자 전달이 call by value 로 알고 있습니다. 보통 인자를 넘기면 복사본이 넘어가지 않습니까? 포인터 인자를 넘기더라도 포인터 자체가 넘어가는게 아니라 포인터의 복사본이 넘어 간다고 알고 있습니다만...

urmajest의 이미지

포인터도 물론 변수이죠

주소를 저장하는 변수이죠

포인트 변수 역시 스택에 저장이 됩니다(dynamic-stack variable)

그런데 call by reference 를 하면

*주소값* 이 넘어가게 되는 것이죠

우리가 원하는 r-value를 찾을 때에는 indirect addressing으로 찾아오므로

가능한 것이지요

C에서는 아무래도 예외적인 표현이 많아서

일관성이 좀 부족한데, (lack of orthogonality 라고 하죠 ^^)

한번 잘 이해하시면 세그먼 폴트 따위야 일어나지도 않을거예요 ^^

그럼

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.