본문 바로가기

Algorithm/C프로그래밍

[9주차] 동적 할당

반응형

#12.1 동적할당 개요

정적 메모리 할당

프로그램 실행 전에 변수의 메모리 할당 크기가 정해지고 메모리 할당 크기가 실행하는 중에 변하지 않는 방식을 정적 할당이라고 한다.

  • 지금까지는 "변수 선언"을 통해서 기억 장소를 확보했다.
  • 변수는 코드 작성 단계에서 정해지고, 할당되는 메모리 크기는 프로그램을 실행할 때마다 일정하다.
char ch;	// 1 바이트 - 일반 변수
int score[10];	// 40 바이트 - 배열 변수
struct student {int id; float avg;} st1;	// 8 바이트 - 구조체 변수
int *pi;	// 4 바이트 - 포인터 변수

 

정적 할당 방식의 문제점

  • 필요한 메모리 크기를 모를 때, 최대로 큰 크기를 가정해서 변수를 선언해야 한다.
    • 프로그램 실행 전 메모리의 필요 크기를 알 수 없으면 메모리 낭비가 발생한다.

 

동적(dynamic) 메모리 할당

프로그램을 실행하는 동안 결정되는 크기에 따라 메모리를 할당하는 방식

  • 메모리를 효율적으로 사용할 수 있다.

 

#12.2 동적 메모리 사용 절차(1)

메모리 사용 절차

(동적, 정적 모두 해당됨)

  • 메모리 사용을 위해서는 메모리를 할당하고 해제하는 과정이 필요하다.
    • 할당: 필요한 메모리를 시스템으로부터 받기
    • 사용: 할당된 메모리 사용
    • 해제: 사용이 끝난 메모리를 시스템에 반납
  • 정적 할당 vs. 동적 할당
    • 정적 할당: 위의 과정이 프로그램과 함수의 실행 및 종료에 따라 자동으로 수행된다.
    • 동적 할당: 프로그래머가 필요한 과정을 코드에 명시적으로 작성해주어야 한다.

 

동적 할당 기본 예제

동적으로 메모리를 할당하고 해제하는 라이브러리 함수는 <stdlib.h> 헤더 파일에 선언되어 있다.

#include <stdlib.h>	// 동적 메모리 관련 함수 사용을 위한 헤더

int main() {
	int *p = NULL;	// 동적 메모리 접근을 위한 포인터 변수
    p = (int *) malloc(5*sizeof(int));	// 동적 메모리 할당
    
    p[0] = 1;	// 동적 메모리 사용: 배열 형태
    *(p+2) = 3;	// 동적 메모리 사용: 포인터 형태
    
    free(p);	// 동적 메모리 해제
    return 0;
}

 

동적 메모리 할당: malloc() 함수

인자로 요청된 크기의 연속된 메모리 할당(memory allocation)

함수 원형 void * malloc(unsigned int size);
함수 인자
  • 할당 받을 메모리 크기(바이트 단위)
  • 보통 sizeof() 연산자 활용
기능 및 반환 값
  • 할당 받은 메모리의 시작 주소를 반환
  • 할당에 실패하면 -> NULL 반환
  • 반환 값의 유형: void형 포인터(void *)
  • void*: 특정 자료형을 나타내지 않는 주소를 의미(13.6절)
    • ※ void(반환 값이 없음)와 혼동하면 안 된다.
    • 주소를 반환한다고 해석해야 한다.

 

정수 2개를 저장할 공간 할당

malloc(2*sizeof(int));

malloc(8); // 8 바이트 할당

문자 3개를 저장할 공간 할당

malloc(3*sizeof(char));

malloc(3);	// 3 바이트 할당

세종대학교 고급C프로그래밍 동적할당 강의 자료

 

동적 메모리 연결

동적 메모리는 변수 이름을 붙일 수 없기 때문에 포인터 변수를 이용해 간접적으로 참조

자료형 * 포인터_변수명 = NULL;
포인터_변수명 = (자료형 *) malloc(메모리_크기);
// 자료형 -> 사용하고자 하는 자료형으로 명시적 형 변환
// malloc(메모리_크기) -> 할당된 메모리를 어떤 자료형으로 사용할 지 모르므로 (void *)형 변환
int *p = NULL;
p = (int *) malloc(10*sizeof(int)); // int 형으로의 강제 형변환, 40 바이트 할당

세종대학교 고급C프로그래밍 동적할당 강의 자료

 

동적 메모리 사용

  • 할당된 메모리를 포인터 변수에 연결한 후에는 9장 포인터에서 배운대로 사용

ex. 크기가 10인 배열처럼 사용

int *p = (int *) malloc(10*sizeof(int));
// 변수 선언과 동시에 동적 할당된 주소 대입

p[0] = 1; 	// *p = 1 과 동일
*(p+2) = 3;	// p[2] = 3; 과 동일

 

정리

  • 값을 저장하기 위해 필요한 기억 장소를 확보하는 것을 메모리 할당이라고 하고, 정적 메모리 할당과 동적 메모리 할당, 두 가지로 구분된다.
  • 동적 메모리 사용 절차는 동적 메모리 할당, 동적 메모리 사용, 동적 메모리 해제의 세 단계로 구성된다.
  • malloc() 함수는 메모리를 동적으로 할당하고, 인자로 할당할 메모리의 크기를 전달한다.
  • 동적 할당된 메모리 영역은 이름이 없기 때문에, 포인터 변수에 연결해서 사용한다.
반응형

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

[6주차] 구조체  (0) 2021.11.09
[10주차] 동적 할당  (4) 2021.11.05
[5주차] 문자열  (0) 2021.09.29
[4주차] 문자열  (0) 2021.09.27
[2주차] 포인터(3), (4)  (4) 2021.09.13