logo정처기 감자

Command Palette

Search for a command to run...

C언어 동적 메모리 할당 (malloc, free)

코딩C언어
C언어 동적 메모리 할당 (malloc, free)
읽는데 10분 소요
처음 쓰여진 날: 2026-02-03
마지막 수정일: 2026-05-04
조회수: —
선수학습(2개)
  • C언어 포인터의 기초
  • 메모리 구조 (스택, 힙, 데이터 영역)

요약

C언어 동적 메모리 할당의 기본 개념, malloc()과 free() 함수 사용법을 알아봅니다. 정보처리기사 실기에 자주 출제되는 동적 메모리 할당 문제를 풀기 위한 핵심 개념을 정리합니다.

동적 메모리 할당 핵심 정리

개념설명예시
malloc()힙 메모리에서 지정한 크기만큼 할당malloc(sizeof(int))
sizeof()자료형의 크기(바이트)를 반환sizeof(int) = 4
형변환malloc 반환값을 원하는 포인터 타입으로 변환 (생략 가능)(int*)malloc(...)
free()할당된 메모리를 해제free(p);

동적 메모리 할당이란? 기초

동적 메모리 할당은 프로그램 실행 중에 필요한 만큼 메모리를 할당받는 방법입니다.

일반 변수는 스택(Stack) 에 저장되고 크기가 컴파일 시점에 결정됩니다. 반면 동적 메모리는 힙(Heap) 에 저장되고 런타임에 크기를 결정할 수 있습니다. 자세한 내용은 메모리 구조를 참고하세요.

동적 메모리 할당 개념
스택은 크기가 고정되어 있지만, 힙은 malloc()으로 필요한 만큼 할당받을 수 있습니다.
구분스택 메모리힙 메모리
할당 시점컴파일 시실행 시
크기 결정고정가변
해제자동 (함수 종료 시)수동 (free 호출)
예시int arr[10];malloc(sizeof(int)*10)

malloc() 함수 기초

**malloc()**은 Memory Allocation의 약자로, 힙 메모리에서 지정한 바이트만큼 공간을 할당합니다. 사용하려면 #include <stdlib.h>가 필요합니다.

c
코드 하이라이팅 중...
malloc 기본 사용법
malloc은 요청한 크기만큼 힙에서 메모리를 할당하고, 그 주소를 반환합니다.

malloc() 사용 패턴

c
코드 하이라이팅 중...

sizeof() 연산자

sizeof()는 자료형이나 변수의 크기를 바이트 단위로 반환합니다.

자료형sizeof() 결과
char1 바이트
int4 바이트
float4 바이트
double8 바이트
포인터4 또는 8 바이트 (시스템에 따라)
c
코드 하이라이팅 중...

포인터와 배열의 sizeof 차이, 구조체 padding이 크기에 어떻게 영향을 주는지는 sizeof 연산자 페이지에서 자세히 다룹니다.


형변환 (Casting) 기초

malloc()은 void* 타입을 반환합니다. void*는 "아직 타입이 정해지지 않은 범용 주소"로, 어떤 포인터 타입으로든 변환할 수 있습니다.

void*는 다른 포인터 타입으로 자동 변환되므로, 형변환을 생략해도 됩니다.

c
코드 하이라이팅 중...
시험에서는 형변환 없이 나올 수 있습니다
malloc 앞의 (int*), (struct node*) 같은 형변환은 생략 가능합니다. 시험 코드에서 형변환이 없더라도 정상 코드이니 당황하지 마세요.

2차원 배열 동적 할당 심화

2차원 배열을 동적으로 할당하려면 이중 포인터를 사용합니다.

c
코드 하이라이팅 중...
2차원 배열 동적 할당
이중 포인터 arr이 행 포인터 배열을 가리키고, 각 행 포인터가 실제 데이터를 가리킵니다.

2차원 배열 해제

할당의 역순으로 해제해야 합니다. 행 포인터 배열(arr)을 먼저 해제하면 각 행 데이터(arr[0], arr[1], ...)의 주소를 잃어버려서 해제할 수 없게 됩니다.

c
코드 하이라이팅 중...
2차원 배열은 반드시 역순으로 해제하세요
arr을 먼저 free하면 arr[0], arr[1] 등의 주소가 사라져서 각 행 데이터를 해제할 수 없습니다. 항상 안쪽(행 데이터)부터 해제한 뒤 바깥쪽(행 포인터 배열)을 해제하세요.

정적 2차원 배열과의 차이

정적 2차원 배열 int a[3][3]은 메모리가 연속된 한 블록으로 잡히므로, a와 a[0]과 &a[0][0]이 모두 같은 주소를 가리킵니다 (타입만 다름).

정적 2차원 배열 메모리 구조
정적 배열은 연속된 한 블록으로 잡히므로, a, a[0], &a[0][0]이 모두 같은 주소입니다.

반면 동적 할당 int **arr은 malloc을 여러 번 따로 호출하기 때문에 각각 독립적인 메모리 블록이 생깁니다.

c
코드 하이라이팅 중...
동적 할당 2차원 배열 메모리 구조 (빈 상태)
동적 할당은 malloc을 여러 번 호출하여 별도 메모리 블록을 만들기 때문에 arr, arr[0], &arr[0][0]이 모두 다른 주소입니다.

동적 할당에서 arr[0]은 행 포인터 배열에 저장된 포인터 변수이고, arr[0][0]은 별도로 할당된 데이터 블록의 첫 번째 원소입니다. 각 malloc 호출이 서로 다른 메모리 영역을 반환하므로, 이 주소들은 절대 같을 수 없습니다.

동적 할당 2차원 배열에 값이 채워진 상태
값이 채워진 후에도 구조는 동일합니다. 행 포인터(300번대)와 데이터(200번대)가 별도 메모리 블록에 있습니다.

free() 함수 기초

**free()**는 malloc()으로 할당한 메모리를 해제합니다. 해제하지 않으면 메모리 누수(Memory Leak) 가 발생합니다. 메모리 누수란 프로그램이 더 이상 쓰지 않는 메모리를 반환하지 않아, 프로그램이 실행될수록 사용 가능한 메모리가 줄어드는 현상입니다.

c
코드 하이라이팅 중...
free 함수와 메모리 해제
free() 후에는 포인터를 NULL로 설정하는 것이 안전합니다.
free() 후 포인터 사용 금지
해제된 메모리를 다시 사용하면 오류가 발생합니다. free() 후에는 포인터를 NULL로 초기화하세요.

구조체 포인터 동적 할당 패턴 기초

구조체 1개 분량을 malloc으로 할당하고, 화살표 연산자(->)로 멤버에 값을 넣은 뒤 free로 해제하는 흐름은 정처기 실기에서 가장 자주 등장하는 동적 메모리 결합 패턴입니다.

c
코드 하이라이팅 중...

세 단계는 항상 한 묶음으로 움직입니다. 구조체 종류가 바뀌어도 같은 형태가 그대로 적용됩니다.

단계코드의미
할당struct Person* p = (struct Person*)malloc(sizeof(struct Person));힙에 구조체 크기만큼 메모리 확보, 시작 주소를 p에 저장
접근p->age = 30;p가 가리키는 구조체의 age 멤버에 값 대입 ((*p).age와 동일)
해제free(p);할당받은 메모리를 시스템에 반환
구조체 포인터 동적 할당 3단계 메모리 변화
malloc 직후 → 멤버 대입 → free 직후의 메모리 상태 변화. p는 스택에, 구조체 본체는 힙에 자리잡습니다.

메모리 누수 주의

free를 호출하지 않으면 프로그램이 종료될 때까지 해당 힙 메모리는 시스템에 반환되지 않습니다. 함수가 끝날 때 스택의 포인터 변수 p는 사라지지만, 힙에 할당된 구조체 메모리는 그대로 남아 접근할 방법이 사라진 채 자리만 차지합니다. 이것이 메모리 누수(Memory Leak) 입니다.

c
코드 하이라이팅 중...
malloc 한 만큼 free도 한 번
malloc 호출 횟수와 free 호출 횟수가 정확히 짝이 맞아야 누수가 없습니다. 함수 안에서 할당한 구조체를 함수 밖에서 계속 쓸 게 아니라면, 함수가 끝나기 전 free로 해제하세요.

연결 리스트에서의 활용 심화

동적 메모리 할당은 연결 리스트에서 노드 1를 생성할 때 주로 사용됩니다.

c
코드 하이라이팅 중...

-> 는 포인터가 가리키는 구조체의 멤버에 접근하는 연산자입니다. n->c는 (*n).c와 같은 의미입니다.

연결 리스트 삽입 예시

c
코드 하이라이팅 중...

이 함수는 새 노드를 리스트의 맨 앞에 삽입합니다. 구조체 포인터와 함께 사용되는 패턴을 익혀두세요.


연습 문제


정보처리기사 실기 대비 문제


Footnotes

  1. 데이터와 다음 노드의 주소를 함께 담는 구조체 단위. 연결 리스트의 기본 구성 요소입니다. ↩


메가커피와 함께, 홈페이지 개선에 참여하세요! ☕
혹시 이용에 불편한 점이나 개선이 필요한 부분을 발견하셨나요? 댓글로 알려주시면 더 나은 감자가 될 수 있어요! 🥔 제보해주신 모든 분께 메가커피 기프티콘을 드립니다! (본인 이메일로 댓글 달아주셔야해요~)
후수학습(1개)
  • C언어 연결 리스트 (Linked List)

관련 글

(41개)
제목태그업데이트시험
C언어 형변환 (Casting)
C언어코딩C언어
2026-05-15-
C언어 연결 리스트 뒤집기 (Reverse Linked List)
C언어코딩C언어
2026-05-06-
C언어 사용자 정의 함수 기초
C언어코딩C언어
2026-05-06-
정처기 감자정처기 감자

정보처리기사 합격
도와줄라고 하는 감자

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 1회 이론 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 1회 이론 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매
© 2025 재현기획개발. All rights reserved.
  • 정처기 감자의 시작
  • 업데이트 로그
  • 개인정보 처리방침
  • 이용약관
상호명 : 재현기획개발 / 주소: 서울특별시 영등포구 영등포로 150, 지하1층 108호 L145 가라지(당산동1가, 생각공장 당산) / 대표: 김재현 / 전화: 010-8158-7127 / 통신판매업신고: 제2025-서울영등포-1569호 / 이메일: contact@edugamja.com / 사업자등록번호: 573-51-00999