본문 바로가기
ⓒⓞⓓⓘⓝⓖⓣⓔⓢⓣ/ⓒ

[C언어] 동적할당

by heaven00 2023. 11. 1.
728x90

 

1. 프로세스의 메모리 공간

동적할당을 이해하기 위해서는 우선 프로세스의 메모리 공간에 대해 이해해야한다.

프로세스의 메모리 공간은 코드 영역, 스택 영역, 데이터 영역, 힙 영역으로 나뉘어져있다.

 

- 코드 영역 : 프로그램 실행 코드 및 함수가 저장되는 영역

- 스택 영역 : 함수 호출에 대한 매개변수와 지역변수, 함수 내 중괄호 내부에 정의된 변수가 저장되는 영역으로 잠시 사용되고 메모리에서 소멸 시킬 데이터가 저장되는 영역

- 데이터 영역 : 전역 변수, 정적 변수가 저장 되는 영역으로 프로그램이 종료될 때까지 유지되어야하는 데이터가 저장되는 영역

- 힙 영역 : 프로그램이 실행되는 동안에 개발자가 동적으로 메모리를 할당할 수 있는 영역

 

 

 

2. 동적 메모리 할당의 필요성

- 선언된 배열 요소의 수가 사용된 요소 수보다 많은 경우 메모리의 낭비 발생

int array[5];
array[0] = 1;
array[1] = 1;

 

- 선언된 배열 요소의 수가 사용된 요소의 수보다 적은 경우 메모리 부족 에러 발생

int arr[2];
int arr[0] = 1;
int arr[1] = 1;
int arr[2] = 1;

 

- 배열 선언 시 배열 길이에 변수를 설정한 경우 에러 발생 (상수 사용 필요)

int a = 5;
int array[a];

 

 

즉, 개발자가 필요한 메모리 크기를 예측할 수 없을 때 동적할당을 사용!

🔥힙 영역에서 동적 메모리 할당을 한다면, 필요한 시점에 필요한 크기만큼 메모리를 할당할 수 있고 할당 받은 메모리의 시작 주소를 포인터로 저장

 

힙 영역에서 동적 메모리를 할당하기 위해서는 malloc(), calloc(), realloc() 

할당된 메모리를 해제하기 위해서는 free() 함수를 사용

해당 함수들은 헤더파일 stdlib.h에 선언되어 있음

 

 

 

이번 포스팅에서는 주로 사용하는 malloc(), free()에 대해서만 포스팅하고 다른 함수는 나중에 추가할 예정~!

 

 

 

3. malloc() 함수

함수 원형

#include <stdlib.h>
void* malloc(size_t size);

여기서 size_t는 typedef로 재정의해서 만들어진 자료형으로 unsigned long, unsigned int로 정의되어 있음

따라서 malloc() 함수를 정의할 때는 입력 인자로 0보다 큰 수를 입력해야 함

ex) malloc(4)로 호출한다면, 힙 영역에 4바이트 동적 메모리를 할당하겠다는 의미

 

 

return 값

호출 성공 시 메모리의 시작 주소 반환

호출 실패 시(할당할 메모리 공간이 없는 경우) NULL 반환

 

 

특징

malloc() 함수는 void 형의 주소임

-> 주소를 반환할 때 반환되는 주소 값은 어떤 자료형의 주소인지 결정하지 못함

ex) malloc(4)와 같이 동적 메모리를 할당했다면, 4바이트 메모리 할당 후에 주소를 반환할 때 char형인지 int형인지 모르므로 void형 주소를 반환하고, 프로그래머가 필요한 자료형으로 형변환해서 사용하면 됨

 

int main(void)
{
    int* p = NULL;
    p = (int*)malloc(4);
    return 0;
}

 malloc(4)를 통해 4바이트 크기를 힙 영역에 할당한 후 할당된 메모리 공간의 시작 주소를 (int *)주소로 형변환

그 다음, p에 (int*)로 형변환된 malloc(4)의 시작 주소를 저장

 

 

 

4. free() 함수

함수 원형

void free(void* p);

 

malloc() 함수를 통해 동적 메모리가 할당된 공간 해제

 

 

int main(void)
{
    int* p = NULL;
    p = (int*)malloc(4);
    ...
    free(p);
    return 0;
}

p에 저장된 시작 주소의 힙 영역을 해제해주라는 의미 -> 메모리 낭비 문제 해결

 

 

 

 

5. 예제 코드

#include <stdio.h>
#include <stdlib.h>
int main(void) {
	int *p = NULL;
    p = (int*)malloc(4);
    
    if(p==NULL)
    	printf("동적 메모리 할당 공간 부족");
    
    *p = 10;
    printf("주소 : %x \n", p);
    printf("값 : %d \n", *p);
    
    free(p);
    p = NULL;	//p는 포인터 변수이기 때문에 NULL로 초기화하는 것이 좋음
    
    return 0;
}

 

주소 : 393288
값 : 10

 

 

 

6. 추천 문제

https://school.programmers.co.kr/learn/courses/30/lessons/120809

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

https://school.programmers.co.kr/learn/courses/30/lessons/120822

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

728x90

댓글