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 안녕하세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.