이 편은 실제 기출 문제가 아닙니다. 독학사 2단계 C프로그래밍 관련 reference/ 기출 원문은 확보되어 있지 않습니다. 아래 22개 문항은 국가평생교육진흥원 독학학위제 독학사 2단계 C프로그래밍 출제기준(평가영역) 중에서도 포인터·동적 메모리·구조체·파일 입출력·선행처리기처럼 오답률이 높은 영역을 근거로 새로 구성한 실전형 모의 문항입니다. 실제 시험의 문장·코드·보기 배열과 다를 수 있습니다.
회차별 실제 출제 문항 수·배점·시간은 매 공고마다 다를 수 있으므로, 응시 전 국가평생교육진흥원 공고 원문을 반드시 확인하십시오.
이 편이 다루는 범위와 접근법
26편이 06~22편 전 범위를 균형 있게 점검하는 모의고사였다면, 이 편은 그중에서도 독학사 응시자들이 가장 자주 틀리는 고난도 영역만을 추려 난이도를 강화했습니다. 함수 포인터와 포인터 배열, 2차원 배열과 포인터의 관계, 구조체 포인터와 중첩 구조체, realloc·댕글링 포인터·이중 해제 같은 동적 메모리 함정, 파일 입출력의 세부 규칙, 매크로의 텍스트 치환이 만드는 부작용, 그리고 이 모든 개념이 뒤섞인 오류 찾기형·통합형 문제까지 다룹니다.
이 영역의 공통점은 “겉보기에는 그럴듯하지만 실제로는 정의되지 않은 동작(undefined behavior)이거나 규칙을 잘못 적용한 코드”가 많다는 것입니다. 문제를 풀 때는 다음 순서를 지키십시오. ① 선언부에서 각 변수·포인터가 정확히 무엇을 가리키는지 표시한다. ② 포인터 연산이나 함수 호출이 일어날 때마다 그 대상이 스택인지 힙인지 구분한다. ③ 매크로나 조건부 컴파일처럼 컴파일 이전 단계에서 일어나는 치환을 먼저 손으로 펼쳐 본 뒤에 나머지 로직을 추적한다. 틀린 문항은 괄호로 표시된 관련 편으로 돌아가 개념을 다시 확인하십시오.
마무리 복습
1~3번 — 포인터 심화: 함수 포인터·포인터 배열 (12, 13편)
#include <stdio.h>
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int main(void) {
int (*fp)(int, int) = add;
int result = fp(10, 3);
fp = sub;
result += fp(10, 3);
printf("%d\n", result);
return 0;
}#include <stdio.h>
int main(void) {
char *fruits[3] = {"apple", "banana", "cherry"};
char **p = fruits;
printf("%s\n", *(p + 1));
return 0;
}4~6번 — 배열과 포인터의 고급 관계 (11, 12편)
#include <stdio.h>
int main(void) {
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
printf("%d %d\n", arr[1][2], *(*(arr + 1) + 2));
return 0;
}int *arr1[5];
int (*arr2)[5];7~9번 — 구조체 심화: 구조체 포인터·중첩 구조체·동적 배열 (14, 18편)
#include <stdio.h>
struct Point {
int x, y;
};
int main(void) {
struct Point p1 = {3, 4};
struct Point *ptr = &p1;
ptr->x = ptr->x + 10;
(*ptr).y = (*ptr).y + 20;
printf("%d %d\n", p1.x, p1.y);
return 0;
}struct Address {
char city[20];
};
struct Person {
char name[20];
struct Address addr;
};struct Person p;와 struct Person *pp = &p;가 선언되어 있다고 할 때,
#include <stdio.h>
#include <stdlib.h>
struct Item {
int id;
};
int main(void) {
struct Item *arr = (struct Item *)malloc(3 * sizeof(struct Item));
for (int i = 0; i < 3; i++) {
arr[i].id = i * 10;
}
printf("%d\n", arr[1].id);
free(arr);
return 0;
}10~12번 — 동적 메모리 심화: realloc·댕글링 포인터·이중 해제 (17편)
int *createArray(void) {
int arr[5] = {1, 2, 3, 4, 5};
return arr;
}#include <stdlib.h>
int main(void) {
int *p = (int *)malloc(sizeof(int));
*p = 5;
free(p);
free(p);
return 0;
}13~15번 — 파일 입출력 심화 (16, 18편)
#include <stdio.h>
struct Record {
int id;
double score;
};
int main(void) {
struct Record r1 = {1, 95.5};
FILE *fp = fopen("data.bin", "wb");
fwrite(&r1, sizeof(struct Record), 1, fp);
fclose(fp);
struct Record r2;
fp = fopen("data.bin", "rb");
fread(&r2, sizeof(struct Record), 1, fp);
fclose(fp);
printf("%d %.1f\n", r2.id, r2.score);
return 0;
}16~18번 — 선행처리기 심화 (15편)
#include <stdio.h>
#define SQUARE(x) x * x
int main(void) {
int i = 3;
int result = SQUARE(i++);
printf("%d\n", result);
return 0;
}#include <stdio.h>
#define DEBUG
int main(void) {
#ifdef DEBUG
printf("debug mode\n");
#else
printf("release mode\n");
#endif
printf("done\n");
return 0;
}19~20번 — 오류 찾기 고난도 (21편)
#include <stdio.h>
int main(void) {
int arr[5] = {1, 2, 3, 4, 5};
int sum = 0;
for (int i = 0; i <= 5; i++) {
sum += arr[i];
}
printf("%d\n", sum);
return 0;
}#include <string.h>
void appendMessage(char *dest) {
strcat(dest, " World");
}
int main(void) {
char *msg;
appendMessage(msg);
printf("%s\n", msg);
return 0;
}21~22번 — 통합 문제 (18, 20편)
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node *next;
};
int main(void) {
struct Node *head = (struct Node *)malloc(sizeof(struct Node));
head->data = 1;
head->next = (struct Node *)malloc(sizeof(struct Node));
head->next->data = 2;
head->next->next = NULL;
printf("%d %d\n", head->data, head->next->data);
free(head->next);
free(head);
return 0;
}#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *str = "1234";
int num = atoi(str);
printf("%d\n", num + 1);
return 0;
}참고 자료
- 국가평생교육진흥원 독학학위제: https://bdes.nile.or.kr
- cppreference — C 표준 라이브러리·문법 레퍼런스: https://en.cppreference.com/w/c