C 언어 메모리 할당과 컴파일 과정 객관식 문제
이 글에서는 C 언어의 메모리 할당(Memory Allocation)과 컴파일 과정(Compilation Process)에 관한 대표적인 객관식(MCQ) 문제들을 소개합니다. 면접 준비나 자격증 시험 대비에 유용하게 활용할 수 있습니다.
문제 1 − 다음 코드의 출력 결과는 무엇인가?
#include <stdio.h>
#include <stdlib.h>
int main() {
union my_union {
int i;
float f;
char c;
};
union my_union* u;
u = (union my_union*)malloc(sizeof(union my_union));
u->f = 20.60f;
printf("%f", u->f);
}보기
- 쓰레기 값(Garbage Value)
- 20.600000
- 문법 오류(Syntax Error)
- 20.6
해설
정답은 B(20.600000)입니다. 공용체(union)는 여러 타입의 데이터를 같은 메모리 위치에 저장할 수 있도록 해주며, 모든 멤버가 가장 큰 멤버 크기만큼의 동일한 메모리 공간을 공유합니다. 이 코드에서는 float 타입으로 값을 저장했으므로, %f 형식 지정자에 따라 20.60f는 소수점 여섯 자리까지 표현된 20.600000으로 출력됩니다.
문제 2 − 컴파일 과정의 올바른 순서는 무엇인가?
보기
- 어셈블러 → 컴파일러 → 전처리기 → 링커
- 컴파일러 → 어셈블러 → 전처리기 → 링커
- 전처리기 → 컴파일러 → 어셈블러 → 링커
- 어셈블러 → 컴파일러 → 링커 → 전처리기
해설
정답은 C입니다. C 프로그램의 빌드 과정은 다음 순서로 진행됩니다.
- 전처리(Preprocessing): #include, #define 등의 지시문이 처리됩니다.
- 컴파일(Compilation): 소스 코드가 어셈블리 코드로 변환됩니다.
- 어셈블(Assembly): 어셈블리 코드가 목적 코드(Object Code)로 변환됩니다.
- 링킹(Linking): 목적 파일들과 라이브러리가 연결되어 실행 파일이 생성됩니다.
문제 3 − 다음 중 참인 설명은 무엇인가?
보기
- 링킹 단계에서 #include 코드가 stdio.h로 대체된다
- 전처리 단계에서 #include 코드가 stdio.h로 대체된다
- 실행 단계에서 #include 코드가 stdio.h로 대체된다
- 편집 단계에서 #include 코드가 stdio.h로 대체된다
해설
정답은 B입니다. 컴파일러에 코드가 전달되기 전에 먼저 전처리(preprocessing)가 수행되며, 이 단계에서 #include 지시문에 명시된 헤더 파일(stdio.h 등)의 내용이 소스 코드에 삽입됩니다. 즉, 헤더 파일 포함은 전처리기가 담당합니다.
문제 4 − fflush() 함수를 사용하는 목적은 무엇인가?
보기
- 모든 스트림 또는 지정된 스트림을 플러시한다
- 지정된 스트림만 플러시한다
- 입출력 버퍼를 플러시한다
- 유효하지 않은 라이브러리 함수이다
해설
정답은 A입니다. fflush() 함수는 출력 스트림을 플러시하는 데 사용됩니다. 인수로 NULL을 전달하면 열려 있는 모든 출력 스트림을 플러시하고, 특정 스트림을 지정하면 해당 스트림만 플러시합니다. 이 함수는 출력 버퍼를 비워 버퍼에 남아 있는 데이터를 콘솔(또는 파일)로 내보내는 역할을 합니다.
문제 5 − 다음 코드의 오류를 지적하시오
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char* ptr;
*ptr = (int*)malloc(30);
strcpy(ptr, "ABC");
printf("%s", ptr);
free(ptr);
}보기
- strcpy() 문장에 오류가 있다
- *ptr = (int*)malloc(30); 에 오류가 있다
- free(ptr)에 오류가 있다
- 오류가 없다
해설
정답은 B입니다. *ptr = (int*)malloc(30); 문장에서는 포인터가 가리키는 위치에 malloc()이 반환하는 주소값을 저장하려고 하기 때문에, 컴파일러는 "포인터로부터 캐스트 없이 정수를 만든다(makes integer from pointer without a cast)"는 경고 또는 오류를 발생시킵니다. 올바른 코드는 포인터 변수 자체에 반환된 주소를 저장하는 다음과 같은 형태여야 합니다.
ptr = (char*)malloc(30);