프로그래밍시스템 프로그래머

C에서 가변 인수 함수와 표준 함수의 차이점을 설명하십시오. 가변 인수 함수를 어떻게 구현합니까?

Hintsage AI 어시스턴트로 면접 통과

답변

C 언어에서 함수는 고정된 수 또는 가변 수의 인수를 받을 수 있습니다. 표준 함수는 다음과 같이 정의됩니다:

int sum(int a, int b) { return a + b; }

가변 인수를 처리하기 위해 <stdarg.h> 매크로를 사용하여 다양한 수의 입력 매개변수를 처리할 수 있습니다.

예:

#include <stdarg.h> #include <stdio.h> int sum(int count, ...) { int total = 0; va_list args; va_start(args, count); for (int i = 0; i < count; ++i) { total += va_arg(args, int); } va_end(args); return total; }

함정 질문

가변 인수 함수와 오버 로드된 함수의 차이점은 무엇이며, C에서 오버로딩을 어떻게 구현합니까?

답변: C에는 C++와 같은 함수 오버로딩 지원이 없습니다: 함수 이름과 인수의 수는 고유해야 합니다. 가변 인수는 범용 인터페이스를 구현하지만 이는 "오버로딩"이 아닙니다.

예 (잘못됨):

// C에서는 같은 이름의 두 개의 함수를 만들 수 없으므로 작동하지 않습니다: int foo(int a); float foo(float b); // 컴파일 오류.

주제에 대한 세부 사항 미숙지로 인한 실제 오류 사례


이야기

대규모 프로젝트에서 가변 인수 함수를 사용했으나 전달된 값의 타입을 검사하지 않았습니다. 모든 인수가 int형이 될 것으로 예상했으나, 한 번 double형이 전달되어 잘못된 메모리 읽기 및 애플리케이션의 임의 중단이 발생했습니다.

이야기

한 개발자가 va_end를 호출하는 것을 잊어버려 일부 아키텍처에서 자원 누수가 발생했습니다. 증상은 함수의 반복 사용 시에만 나타났습니다.

이야기

가변 인수가 있는 함수를 처리할 때 va_list를 두 번 사용했지만 va_copy를 호출하지 않아 예측할 수 없는 동작이 발생했습니다. 오류는 즉시 나타나지 않고 컴파일러 변경 후에만 발생했습니다.