2011-03-30 2 views
0

컴퓨터가 얼마나 많은 인수를 따르는 지 알 수 있습니까? 인수의 수를 정의되지 않은 걸립니다 printf 함수컴퓨터가 얼마나 많은 인수를 따르는 지 알 수 있습니까?

의 종류가 있기 때문에

우리는 역순으로

를 인수했습니다.

pritnf의 경우 컴퓨터는 몇 개의 인수를 따르는 지 알 수 있습니다.

형식 문자열에 "% s 안녕하세요. 환영합니다 % s"이 포함 된 경우 2 개의 인수를 더 읽으십시오.

하지만 어떻게

INT의 FUNC과 같은 프로토 타입

이러한 기능에 올 때 컴퓨터가 알고있는 수의 (a를 INT, INT의 B, ...)?

누군가가 어셈블리 수준에서 나를 설명 할 수 있습니까?

감사합니다.

+2

그렇지 않습니다. 당신은 약간의 대회를 사용할 필요가 있습니다. (호출자는 얼마나 많은 인수가 전달되었는지 알고 있으므로 나중에 관계없이 정리할 수 있습니다.) Unix-likes의'execl()'은 인수의 끝에'NULL' 포인터를 사용합니다. – geekosaur

+0

컴퓨터가 아무 것도 알지 못합니다;) –

+0

어떤 컨벤션을 사용해야하며 어떻게 작동해야하는지에 대해 좀 더 구체적으로 설명 할 수 있습니까? –

답변

1

그것은하지 않습니다. 당신은 printf("%d") 수 있습니다, 그것은 단순히 스택에 찾은 것을 인쇄합니다. (프로그래머)은 함수를 호출하고 작성할 때 함수가 필요로하는 인수의 수를 알아야합니다. 확실하지 않은 경우, 첫 번째 인수로 다른 인수의 수를 갖는 함수를 작성할 수 있습니다.
어셈블리 수준에서 아무 것도 변경되지 않습니다. 매개 변수는 항상 ebp 앞에 위치하고 (이전에 푸시되었지만 주소가 ebp보다 높으므로 ebp + 8 (첫 번째 인수)부터 시작 함) int func(int a, int b, ...)이 43 개의 매개 변수를 사용한다는 것을 알게된다면 ebp + 8에서 ebp + 0x160까지입니다 (모두 0x391 = 452dec = 8 + 43 * 4 인 것으로 가정하면 모두 int입니다).
물론 잘못된 수의 매개 변수로 인해 프로그램이 작동을 멈추거나 이상하게 작동 할 수 있습니다 (printf("%s"))

1

답변은 그렇지 않습니다. 대부분의 컴파일러가 기반으로하는 ANSI C89 표준은 어떤 종류의 인수가 지정되었는지 감지하는 방법을 정의하지 않습니다. printf()는 어떤 인수와 유형이 지정되었는지를 정확히 지정하는 형식 문자열을 가지고 있기 때문에 작동합니다. 전달되는 내용을 어떻게 든 알고 있어야하고 그에 따라 stdarg.h의 va_ * 매크로를 사용해야합니다. ANSI C89 초안의 섹션 4.8에서는 잘못된 유형이나 잘못된 인수 수가 실제로 전달 된 것에서 요청한 경우 동작이 정의되지 않았다고 말합니다.

은 ANSI C89의 초안에서 피투성이 자세한 내용은이 읽기 : http://flash-gordon.me.uk/ansi.c.txt