본문 바로가기
프로그래밍/C

동적 할당 메모리

by 길냥이 2025. 6. 14.
728x90

목차

  1. 정적 메모리 할당
  2. 동적 메모리 할당 malloc(), free
  3. calloc(), realoc()
  4. 구조체 동적 생성
  5. 연결 리스트

 

1. 정적 메모리 할당 

프로그램이 메모리를 할당받는 방법은 두 가지가 있습니다.

그동안 사용된 정적(static)할당과, 

여기서 학습할 동적(dunamic)할당이 존재합니다.

 

정적 할당은 프로그램이 시작되기 전에 미리 정해진 크기의 메모리를 할당받습니다.

예를 들어 배열 선언인 int score_s[100]; 같은게 있겠네요.

 

이 경우, 처음에 선언된 배열인 100을 넘어가는 입력이 들어온다면 처리하지 못합니다.

반대로 더 작은 입력이 들어온다면 남은 메모리 공간은 낭비되게 됩니다.

 

2. 동적 메모리 할당 malloc(), free

그럴 때 사용되는 것이 동적 메모리 할당입니다.

동적 메모리는 실행 도중에 메모리를 할당받으며, 사용이 끝나면 시스템에 메모리를 반납합니다.

필요한 만큼만 할당을 받아 메모리를 매우 효율적으로 사용할 수 있습니다.

 

동적 메모리를 할당하고 반환하는 방법은 다음과 같습니다.

int* pi;

pi = (int*)malloc(4 * sizeof(int));

free(pi);

 

첫 줄에서 int형 데이터를 저장할 메모리 공간의 주소를 받을 포인터 변수를 선언합니다.

두 번째 줄에서 동적 메모리를 할당합니다. int형 크기만큼의 메모리를 할당하고, 해당 메모리의 시작 주소를 반환받은 뒤

포인터 pi에 저장합니다. 

세 번째 줄에서 동적 메모리 사용 후 반환을 통해 메모리 누수를 방지합니다.

 

3. calloc(), realloc()

calloc() 함수는 메모리를 할당합니다. 

사용 방법은 malloc와 비슷하지만 조금 다릅니다. 

int* pi;

pi = (int*)calloc(5, sizeof(int));

free(pi);

처럼 선언하면 됩니다. 하지만 calloc는 할당 받은 메모리에 0을 채워넣는 초기화 과정을 추가로 선언합니다.

따라서 추가적인 메모리 비용이 발생할 수 있지만, malloc와 다르게 값을 추가적으로 초기화할 필요가 없습니다.

 

realloc()는 할당하였던 메모리 블럭의 크기를 변경합니다. 

pi = realloc(pi, 10 * sizeof(int)); 처럼 크기를 변경할 수 있습니다.

 

4. 구조체 동적 생성

구조체 또한 동적 생성이 가능합니다.

예를 들어 구조체 struct student가 선언되면, 

다음과 같이 동적 생성이 가능합니다. 

 

struct std *p;

p = (struct std*)malloc(2 * sizeof(struct std)); 처럼 선언할 수 있습니다.

 

5. 연결 리스트

한번에 여러 자료를 저장하는 데는 배열(array)말고도 연결 리스트(linked list) 또한 존재합니다.

 

연결 리스트는 배열과 다르게 중간에 데이터를 제거하거나, 추가하는 것이 편리합니다.

728x90

'프로그래밍 > C' 카테고리의 다른 글

포인터 - 예제 모음  (0) 2025.06.17
변수의 영역과 데이터 공유 - 예제 모음  (0) 2025.06.17
전처리 지시자  (0) 2025.06.14
파일 입출력 함수  (0) 2025.06.14
파일 개방과 입출력  (2) 2025.06.14