재구성 출제 고지: 이 문제집은 국가평생교육진흥원 독학학위제 2단계 C프로그래밍 출제기준(배열·문자열, 포인터 영역)의 평가 범위와 문항 유형을 분석해 새로 구성한 재구성 문항입니다. 실제 기출 문항을 그대로 옮긴 것이 아닙니다. 회차별 정확한 문항 수·시험 시간은 시행처 공고를 확인해야 하며, 여기서는 22문항을 표준 분량으로 구성했습니다.
출제 범위와 문항 배분
| 영역 | 문항 수 | 문항 번호 | 관련 편 |
|---|---|---|---|
| 배열 기초와 초기화 | 3 | 1–3 | 11 |
| 문자열과 char 배열 | 4 | 4–7 | 11 |
| 포인터 기초: 주소·역참조·배열과의 관계 | 5 | 8–12 | 12 |
| 포인터와 함수: 인자 전달·스택 프레임 | 5 | 13–17 | 13, 10 |
| 문자열 라이브러리 함수 | 5 | 18–22 | 19 |
이 영역은 독학사 C프로그래밍에서 오답률이 가장 높은 부분입니다. 배열 이름과 포인터의 관계, 함수에 배열·포인터를 넘길 때 실제로 무엇이 전달되는지, 문자열의 끝을 표시하는 널 문자(널 종료 문자, \0)가 어디에 있는지를 눈으로 직접 추적하는 습관이 필요합니다. 각 문제마다 변수와 메모리 상태를 손으로 그려보고 정답을 확인하세요.
배열 기초와 초기화 (1–3)
문제 1
#include <stdio.h>
int main(void) {
int arr[6] = {2, 4, 6, 8, 10, 12};
int sum = 0;
for (int i = 0; i < 6; i += 2) {
sum += arr[i];
}
printf("%d\n", sum);
return 0;
}문제 2
#include <stdio.h>
int main(void) {
int arr[5] = {1, 2};
printf("%d %d\n", arr[2], arr[4]);
return 0;
}문제 3
#include <stdio.h>
int main(void) {
char str[] = "Hi";
printf("%d\n", (int)sizeof(str));
return 0;
}문자열과 char 배열 (4–7)
문제 4
#include <stdio.h>
#include <string.h>
int main(void) {
char str[10] = "Hi";
printf("%d %d\n", (int)strlen(str), (int)sizeof(str));
return 0;
}문제 5
#include <stdio.h>
int main(void) {
char str[10] = "Hello";
printf("%d\n", str[5]);
return 0;
}문제 6
#include <stdio.h>
void printSize(char arr[]) {
printf("%d\n", (int)sizeof(arr));
}
int main(void) {
char str[10] = "Hello";
printf("%d ", (int)sizeof(str));
printSize(str);
return 0;
}(64비트 환경, 포인터 크기 8바이트 기준)
문제 7
char a[10] = "Hello";
char b[10];위 두 배열이 선언되어 있다고 할 때, 다음 네 문장 중 하나를 실행하면 컴파일 오류가 발생한다.
포인터 기초: 주소·역참조·배열과의 관계 (8–12)
문제 8
#include <stdio.h>
int main(void) {
int x = 10;
int *p = &x;
*p = 20;
printf("%d %d\n", x, *p);
return 0;
}배열 이름이 포인터로 변환되는 과정과 포인터 연산의 관계는 다음 그림처럼 이해하면 편합니다. int arr[5] = {10, 20, 30, 40, 50};이고 int *p = arr;일 때, p는 arr의 첫 원소를 가리키고 p + n은 그로부터 int 크기만큼 n칸 이동한 주소를 뜻합니다.
int형 크기가 4바이트인 환경에서는 p + 1이 실제 주소로는 4바이트 뒤로 이동합니다. 포인터에 정수를 더할 때는 그 자료형의 크기만큼 주소가 이동한다는 점이 이 그림의 핵심입니다.
문제 9
#include <stdio.h>
int main(void) {
int arr[5] = {10, 20, 30, 40, 50};
int *p = arr;
printf("%d %d\n", *(p + 3), *p + 3);
return 0;
}문제 10
#include <stdio.h>
int main(void) {
int x = 5;
int *p = &x;
int **pp = &p;
**pp = 100;
printf("%d\n", x);
return 0;
}문제 11
문제 12
포인터와 함수: 인자 전달·스택 프레임 (13–17)
문제 13
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main(void) {
int x = 1, y = 2;
swap(&x, &y);
printf("%d %d\n", x, y);
return 0;
}문제 14
#include <stdio.h>
void addOne(int arr[], int size) {
for (int i = 0; i < size; i++) {
arr[i] += 1;
}
}
int main(void) {
int nums[3] = {1, 2, 3};
addOne(nums, 3);
printf("%d %d %d\n", nums[0], nums[1], nums[2]);
return 0;
}문제 15
문제 16
int *createDangling(void) {
int local = 10;
return &local;
}문제 17
#include <stdio.h>
int square(int n) {
int result = n * n;
return result;
}
int main(void) {
int a = 3;
int b = square(a);
int c = square(b);
printf("%d\n", c);
return 0;
}함수가 호출될 때마다 새로 만들어지는 스택 프레임(stack frame)의 상태를 표로 추적하면 다음과 같습니다.
| 호출 순서 | 호출식 | 매개변수 n | 지역변수 result | 반환값 | 대입된 변수 |
|---|---|---|---|---|---|
| 1 | square(a) | 3 | 9 | 9 | b = 9 |
| 2 | square(b) | 9 | 81 | 81 | c = 81 |
문자열 라이브러리 함수 (18–22)
문제 18
문제 19
#include <stdio.h>
#include <string.h>
int main(void) {
char a[] = "apple";
char b[] = "applesauce";
printf("%d\n", strncmp(a, b, 5));
return 0;
}문제 20
#include <stdio.h>
#include <string.h>
int main(void) {
char dest[20] = "Foo";
strcat(dest, "Bar");
printf("%s\n", dest);
return 0;
}문제 21
문제 22
#include <stdio.h>
#include <string.h>
int main(void) {
char dest[10];
strncpy(dest, "HelloWorld", 5);
dest[5] = '\0';
printf("%s\n", dest);
return 0;
}