C 언어 에서 가 변 매개 변수의 사용 방법 예시
C 언어 프로그램 작성 에서 우리 가 가장 많이 사용 하 는 함 수 는 printf 와 유사 한 변형 체 를 포함 합 니 다.이 함 수 는 C 라 이브 러 리 함수 에 포함 되 어 있 으 며 int printf(const char*format,...)로 정의 합 니 다.
포맷 문자열 외 에 도 여러 개의 가 변 파 라 메 트릭 을 입력 할 수 있 습 니 다.예 를 들 어:
printf("%d",i);
printf("%s",s);
printf("the number is %d ,string is:%s", i, s);
포맷 문자열 의 판단 은 이 장 에서 잠시 논 하지 않 고 가 변 매개 변수의 실현 세부 사항 을 분석 합 니 다.간단 한 실례
int simple(int num,...)
{
int i, result=0;
va_list vl; //va_list , va_start , char*
va_start(vl,num); //
printf("num:%d, vl:%d
",num,*vl);
for (i = 0; i < (num-1); i++)// num
{
result = va_arg(vl, int);// vl 4 (sizeof(int) ) , (
)
printf("in for result:%d, *vl:%d
", result, *vl);// , ,vl result
}
va_end(vl);//
return result;
}
int main(int argc, char **argv)
{
int num = argc;
int i = 0;
simple(5,1,2,3,4,5);
return 1;
}
실행 결 과 는 다음 과 같 습 니 다.book@book-desktop:~/own$ ./varlist
num:5, vl:1
in for result:1, *vl:2
in for result:2, *vl:3
in for result:3, *vl:4
in for result:4, *vl:5
관련 API 소개
가 변 매개 변수 목록 의 실현 은 몇 개의 매크로 로 구성 되 어 있 으 며,파일 include/stdarg.h 에서:
va_list 특정한 변 수 를 정의 합 니 다.커 널 의 정의:
typedef char *va_list;//
va_start(ap, type) 가 변 매개 변수 목록 의 첫 번 째 매개 변수(...안의 첫 번 째)를 가 져 오기 시작 합 니 다.즉,첫 번 째 매개 변수(즉 num)를 건 너 뛰 는 것 입 니 다.
#ifndef __sparc__
#define va_start(AP, LASTARG) \
(AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))//ap ,lastarg
#else
#define va_start(AP, LASTARG) \
(__builtin_saveregs (), \
AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG))) // ,
#endif
// type int 4, int 4
#define __va_rounded_size(TYPE) \
(((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
va_arg(args, int) 가 변 매개 변수 목록 의 매개 변 수 를 순환 적 으로 가 져 옵 니 다.args 는 다음 매개 변수 주 소 를 가리 키 고 현재 매개 변수 주 소 를 되 돌려 줍 니 다.
// first=va_arg(args,int)
#define va_arg(AP, TYPE) \//ap
(AP += __va_rounded_size (TYPE), \// ap - sizeof(type) ,
*((TYPE *) (AP - __va_rounded_size (TYPE))))
// type int 4, int 4
#define __va_rounded_size(TYPE) \
(((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
마지막 바end(ap)종료 플래그 는 프로그램 에서 가 변 매개 변수 목록 의 끝 표지 일 수 있 습 니 다.3.가 변 참사 응용 은 주의사항
왜냐하면 바start, va_arg, va_end 등 은 매크로 로 정의 되 어 있 기 때문에 어 리 석 어 보 입 니 다.가 변 적 인 매개 변수의 유형 과 개 수 는 이 함수 에서 프로그램 코드 에 의 해 제어 되 고 서로 다른 매개 변수의 개수 와 유형 을 스마트 하 게 식별 할 수 없습니다.그러면 printf 에서 스마트 식별 파 라 메 터 를 실현 하지 않 았 습 니까?함수 printf 는 고정 매개 변수 format 문자열 에서 매개 변수의 유형 을 분석 하고 va 를 호출 하기 때 문 입 니 다.arg 는 가 변 적 인 파 라 메 터 를 가 져 옵 니 다.즉,스마트 인식 가 변 적 인 파 라 메 터 를 실현 하려 면 자신의 프로그램 에서 판단 을 통 해 이 루어 져 야 합 니 다.또 하나의 문제 가 있 습 니 다.컴 파일 러 가 가 변 적 인 매개 변수 함수 의 원형 검사 가 엄격 하지 않 고 프로 그래 밍 에 대한 오류 가 있 기 때 문 입 니 다.
simple 가 변 매개 변 수 를 char 형 포인터 로 만 들 면 빈 포인터 가 존재 하면 coredump 가 발생 합 니 다.
void simple(int i, ...)
{
va_list arg_ptr;
char *s=NULL;
va_start(arg_ptr, i);
s=va_arg(arg_ptr, char*);
va_end(arg_ptr);
printf("%d %s
", i, s);
return;
}
가 변 매개 변 수 는 char*형 입 니 다.이 함 수 를 두 개의 매개 변수 로 호출 하 는 것 을 잊 어 버 리 면 core dump(Unix)나 페이지 의 불법 오류(window 플랫폼)가 발생 합 니 다.그러나 오류 가 발생 하지 않 을 수도 있 습 니 다.그러나 오 류 는 발견 하기 어렵 고 질 좋 은 프로그램 을 만 드 는 데 불리 합 니 다.총결산
C 언어 에서 가 변 적 인 매개 변 수 를 사용 하 는 방법 에 대한 예제 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 C 언어 가 변 적 인 매개 변수 용법 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 체인 시계는 뱀을 탐식하는 작은 게임을 실현한다본고의 실례는 여러분에게 C 언어 체인표가 뱀 탐식 게임을 실현하는 구체적인 코드를 공유하여 참고하도록 하였으며, 구체적인 내용은 다음과 같다. 프로젝트 이름: 뱀놀이 운영 환경: Linux 프로그래밍 언어: C 언...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.