현재 선택한 정보처리 과정

정보처리기사 실기 이론 학습

이론 목록으로 돌아가기

C 저장 기간·동적 메모리·함수 포인터

객체의 수명과 함수 호출 가능 대상을 확인한다.

예상 읽기 3

실기 학습 목표

객체의 수명과 함수 호출 가능 대상을 확인한다.

핵심 이론

일반 지역변수는 해당 실행 구간에서 살아 있고, 지역 static 변수는 프로그램 실행 동안 값을 유지한다. 파일 범위 static은 저장 기간과 함께 이름의 내부 연결성을 가진다.

malloc은 초기값이 정해지지 않은 동적 메모리를 확보하고 calloc은 할당 공간을 0비트로 초기화한다. 실패 시 NULL을 확인한다. free 이후 접근·중복 해제는 금지된다.

지역변수의 주소를 반환하면 함수가 끝난 뒤 유효한 객체를 가리키지 않을 수 있다. 저장 기간과 이름의 유효 범위는 같은 개념이 아니다.

int (*f)(int)는 int를 받아 int를 돌려주는 함수의 포인터다. f(x)와 (*f)(x)로 호출한다. 함수 포인터 배열 문제는 먼저 선택된 인덱스를 찾고 그 함수의 본문을 실행한다.

개념 도식

좌우로 이동해 그림을 확인하세요.그림 크게 보기
C 저장 기간·동적 메모리·함수 포인터의 관계와 흐름을 보여 주는 도식
C 저장 기간·동적 메모리·함수 포인터의 관계와 흐름을 보여 주는 도식

변수의 수명과 값을 유지하는 위치

일반 지역변수는 함수 호출마다 새로 만들어지고, static 지역변수는 프로그램 실행 동안 값을 유지한다. 함수 안에 선언되었다는 위치만으로 매번 초기화된다고 판단하면 안 된다. 전역·static 상태표와 호출별 지역 상태표를 나눈다.

f() 안에서 static int s=1; int x=1; return ++s + ++x;를 수행하면 첫 호출은 2+2=4, 다음 호출은 3+2=5다. s는 이전 호출의 2를 이어받지만 x는 다시 1에서 시작하기 때문이다.

malloc은 요청한 크기의 저장 공간을 얻고 포인터를 반환한다. malloc으로 받은 내용은 초기화 전 값을 가정하지 않는다. free는 공간의 수명을 끝내며 포인터 변수에 자동으로 NULL을 대입하지 않는다. 함수에서 반환한 주소가 함수 내부의 수명이 끝난 지역변수 주소인지도 확인해야 한다.

함수 포인터 int (*op)(int,int)에는 같은 매개변수·반환형을 가진 함수의 주소를 담는다. op가 add를 가리키면 op(2,3)은 add(2,3)의 호출이다. 추적표에는 현재 가리키는 함수, 전달 인수, 반환값 세 항목만 적으면 된다. 메모리 할당기 내부나 복잡한 함수 선언자 퍼즐까지 학습 범위를 넓히지 않는다.

풀이 예시

다음 C17 프로그램이 표준 출력에 기록하는 내용을 쓰시오. 마지막 줄바꿈의 유무는 답안에서 구별하지 않는다. 메모리 할당은 성공한다고 가정한다.

C코드 영역 안에서 좌우로 이동할 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
    int *a = malloc(4 * sizeof *a);
    if (a == NULL) return 1;
    a[0] = 2;
    for (int i = 1; i < 4; i++) a[i] = a[i - 1] + i * 2;
    int result = a[3] - a[1];
    free(a);
    printf("%d\n", result);
    return 0;
}

예시 정답

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
10

풀이 과정

할당 영역에 [2,4,8,14]를 차례로 저장한다. 해제 전에 result=14-4=10을 일반 지역변수에 보존했다. 해제된 메모리를 다시 읽지 않으므로 출력은 10이다.

답안 점검

위 풀이 예시의 답을 가린 뒤, 핵심 이론의 규칙을 적용해 직접 풀어 보세요. 코드와 계산 문제는 중간값·단위·최종 출력의 순서를, 용어 문제는 지문의 핵심 단서와 답의 의미를 점검하세요. 해설과 다른 부분이 있으면 어느 조건을 놓쳤는지 확인하고 연결된 실기 문제로 다시 연습하세요.