C 언어의 창 고 는 정적 이다

C 언어의 창 고 는 정적 이다
C 언어 에 가 변 매개 변수 가 생 긴 후에 우 리 는 임의의 매개 변 수 를 전달 할 수 있 습 니 다. 매우 동태 적 인 것 같 지만 가 변 매개 변수 함수 가 동태 적 이지 않 습 니 다.
1. 채찍 이 길 어도 미 치지 못 한다.
우 리 는 main 에서 여러 개의 매개 변수 개수 가 다른 sum 을 호출 하 는 문 구 를 쓸 수 있 지만 특정한 문 구 를 구체 적 으로 보면 sum 의 매개 변수 개 수 는 일정한 것 이다. 예 를 들 어 지난 편의 sum (2, 3, 4) 의 매개 변수 개 수 는 3 이다.프로그램 이 실 행 될 때 sum 함 수 를 호출 할 때 매개 변수 개 수 는 사용자 의 입력 에 따라 정 해 집 니 다. 그러면 가 변 매개 변수 로 이 루어 질 수 없습니다.즉, sum 으로 다음 함수 의 기능 을 실현 할 수 없다 는 것 이다.
//     a      (    n)     
int d_sum(int n, int a[]);

4. 567914. 물론 이 함 수 는 sum 로 하지 않 아 도 잘 이 루어 집 니 다.질문 을 하나 더 바 꾸 겠 습 니 다. 다음 함 수 는 printf 로 어떻게 실현 합 니까?
// fmt       ,     n    (   a  )
//    ,      :
//   int a[] = {1, 2, 3};
//   d_printf("%d+%d=%d", 3, a);
void d_printf(const char *fmt, int n, int a[]);

4. 567914. 이 건 못 하 겠 지!
2. 꼬치 꼬치
  d_printf 가 실현 되 지 못 하 는 이 유 는 이러한 코드 가 정말 쓸 수 없 기 때 문 입 니 다. printf 에 전 달 된 매개 변 수 는 실행 할 때 알 수 있 고 printf 를 호출 하 는 문 구 는 모든 매개 변 수 를 명확 하 게 표시 해 야 합 니 다.
그 근본 적 인 원인 은 C 언어의 스 택 이 정적 이기 때 문 입 니 다. 지난 편의 va. c 컴 파일 된 어 셈 블 리 코드 는 다음 과 같 습 니 다.
main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    $16, %esp   #  main      
    movl    $4, 8(%esp)
    movl    $3, 4(%esp)
    movl    $2, (%esp)
    call    sum         #        sum
    movl    $.LC0, (%esp)
    movl    %eax, 4(%esp)
    call    printf      #        printf
    xorl    %eax, %eax
    leave
    ret

4. 567914. main 함수 에서 두 개의 변 삼 함 수 를 호출 했 지만 스 택 은 동적 가 변 적 인 뜻 이 없다 는 것 을 알 수 있 습 니 다. subl $16,% esp 로 고정된 16 바이트 의 스 택 공간 을 분 배 했 습 니 다. (컴 파일 할 때 12 바이트 가 필요 하 다 고 계산 하고 정리 하 세 요. 16 바이트!)
그리고 dprintf 의 실현 에 있어 서 4 + 4 * n 바이트 의 스 택 공간 을 분배 해 야 합 니 다. printf 에 전 달 된 형식 문자열 포인터 와 n 개의 정 수 를 저장 하 는 데 사용 되 며 C 언어 로 는 실현 할 수 없습니다.
3. 새로운 길 을 개척 합 니 다.
C 언어 는 레지스터 를 직접 사용 할 수 없 지만, 어 셈 블 리 는 가능 합 니 다. 만약 우리 가 d 에 있다 면.printf 에 어 셈 블 리 를 삽입 하여 esp 레지스터 를 수정 하고 스 택 공간 을 동적 으로 분배 하 는 효 과 를 얻 은 다음 에 매개 변 수 를 저장 합 니 다. call printf 를 사용 하면 작업 을 완성 할 수 있 습 니 다.
다음 두 편 은 dprintf 안녕하세요!

좋은 웹페이지 즐겨찾기