배열인자로 함수 호출시 메모리 초기화가 안되네요;

  • Yongrok
    Yongrok

    탑코더 SRM 377, 500문제 푸는데 동작하지 않아서 봤더니
    아래의 memset구문이 메모리 초기화를 시키지 못하더군요;
    왜그럴까요?
    [code]
    void mul( int a[64][64], int b[64][64], int c[64][64], int n){
    memset( c, 0, sizeof(c) ); // why doesn't work?
    }
    [/code]

    [이 글은 과거 홈페이지에서 이전된 글입니다. 원문보기]


    13년 전
6개의 댓글이 있습니다.
  • Toivoa
    Toivoa

    저렇게 호출하면 sizeof(c)가 4가 나오지 않나요?


    13년 전 link
  • dgoon
    dgoon

    void mul(int a[64]) is equivalent to void mul(int * a)
    타입이 array 라도 함수 호출시에 포인터로 받습니다. C에서는 '배열'은 항상 '포인터'로 변해서 넘어가는 걸로 알고 있습니다. 그래서 memset에도 꼭 size를 넣어주는 것일 테고요. ( sizeof 가 제대로 동작하면 memset에 굳이 size를 넘길 필요가 없겠... -_-a - 생각해보니 꼭 그런건 아니군요 ;;)
    그래서 signature는 void(int (*)[64], int (*)[64], int (*)[64])가 됩니다.
    4 <- sizeof( int (*)[64] )
    16384 <- sizeof( int [64][64] )


    13년 전 link
  • Taeyoon_Lee
    Taeyoon_Lee

    =_=경험적으로 안된다는 걸 알고 있지 않나?


    13년 전 link
  • Being
    Being

    T[]와 T*가 달라서 그렇습니다.-ㅁ- 함수의 인자 선언에서 쓰인 배열형은 T*로 완전히 변환됩니다.
    저같은 경우는 구조체(또는 그 포인터)를 넘기는 걸 선호합니다 ㅋㅋ


    13년 전 link
  • JongMan
    JongMan

    rss 리더 보고 답변하러 왔더니 이렇게 답글들이.. 감격적이군요 ㅠ.ㅠ


    13년 전 link
  • Yongrok
    Yongrok

    오 ~_~ 그렇군요. 감사합니다 ~_~
    altertain// 경험엔 항상 망각이 따르지..;;;


    13년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.