C함수 호출에서 배열을 인자로 넘길때 궁금한게 있는데요...
글쓴이: madtag / 작성시간: 수, 2003/04/30 - 4:12오전
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]
Forums:
배열을 넘길뗀 포인터로 넘기죠.안 그럴 경우의 오버해드를 생각해 보세
배열을 넘길뗀 포인터로 넘기죠.
안 그럴 경우의 오버해드를 생각해 보세요 (진짜 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 공부 하시길.
배열이 넘어가는게 아니고 포인터가 넘어가지요...좀 바꿔서 실험해
배열이 넘어가는게 아니고 포인터가 넘어가지요...
좀 바꿔서 실험해보면.... (디버거로 보면 더 학씰하지요... ^^)
결과
아
C에서 매개변수로 배열을 넘길수가
없습미다...
a,b는 배열의 이름입미다..
a[i],b[i]
위 배열의 이름 a,b는 그 배열의 첫번째 인자를
가르키는 포인터 입미다..
============================================================
선한 인간이냐 악한 인간이냐는 그사람의 의지에 달렸다. -에픽테토스-
의지 노력 기다림은 성공의 주춧돌이다. -파스퇴르-
============================================================
보다 정확히 말하면 포인터의 복사본 아닙니까?
C 는 인자 전달이 call by value 로 알고 있습니다. 보통 인자를 넘기면 복사본이 넘어가지 않습니까? 포인터 인자를 넘기더라도 포인터 자체가 넘어가는게 아니라 포인터의 복사본이 넘어 간다고 알고 있습니다만...
우음
포인터도 물론 변수이죠
주소를 저장하는 변수이죠
포인트 변수 역시 스택에 저장이 됩니다(dynamic-stack variable)
그런데 call by reference 를 하면
*주소값* 이 넘어가게 되는 것이죠
우리가 원하는 r-value를 찾을 때에는 indirect addressing으로 찾아오므로
가능한 것이지요
C에서는 아무래도 예외적인 표현이 많아서
일관성이 좀 부족한데, (lack of orthogonality 라고 하죠 ^^)
한번 잘 이해하시면 세그먼 폴트 따위야 일어나지도 않을거예요 ^^
그럼
댓글 달기