Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 메모리 할당 및 컴파일 과정 핵심 MCQ 문제와 해설

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 프로그램의 빌드 과정은 다음 순서로 진행됩니다.

  1. 전처리(Preprocessing): #include, #define 등의 지시문이 처리됩니다.
  2. 컴파일(Compilation): 소스 코드가 어셈블리 코드로 변환됩니다.
  3. 어셈블(Assembly): 어셈블리 코드가 목적 코드(Object Code)로 변환됩니다.
  4. 링킹(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);