메모리 구조, 동적 메모리 할당


1. 메모리 구조 (Memory Structure)

 

  • Process (프로세스) : 프로그램이 실행되는 동안

 실행파일을 실행 시키면 파일은 운영체제에 의해 필요한 영역 즉, 메모리(memory)를 할당받게 된다. 

 프로세스 메모리 구조는 다음과 같이 크게 4가지로 구분된다.

 

주소에 따른 메모리 구조 

  • 코드 영역(Code Segment)
    • 이름 그대로 실행할 프로그램의 코드가 저장되는 메모리 공간

    • CPU는 코드 영역에 저장된 명령문들을 하나씩 가져가서 실행을 함

    • CPU가 읽기 때문에 Text Section 이라고도 한다. 

 

  • 데이터 영역(Data Segment)
    • 전역변수 / static(정적) 변수 

    • 데이터 영역 변수 : 프로그램의 시작과 동시에 메모리 공간에 할당되어 프로그램 종료 시에 소멸한다.

 

  • 힙 영역(Heap Segment)
    • 사용자가 원하는 시점에 할당되거나 소멸하는 유형의 변수가 할당되는 영역

    • 함수가 호출될 때마다 매번 할당이 이뤄지지만, 할당이 되면 전역변수와 마찬가지로 함수를 빠져나가도 소멸되지 않는 성격의 변수가 된다

    • malloc 함수와 free 함수를 통해 이러한 변수를 힙 영역에 할당하고 소멸할 수 있다.

 

  • 스택 영역(Stack Segment)
    • 지역변수 / 매개변수 할당 

    • 선언된 순서대로 아래에서 위로 쌓이는 구조

    • 중간에 함수가 호출될 때마다 새로운 통을 하나 놓고 해당 함수에서 선언된 변수를 차곡차곡 쌓는다

    • 함수가 종료될 경우(=해당 변수가 선언된 함수를 빠져나가면) 소멸된다.

    • 소멸 시에는 맨 위에 있는 변수(=가장 최근 선언된 변수)부터 아래로 내려가면서 쌓인 순서의 역으로 소멸된다.

 


2.  동적 메모리 할당 (Dynamic Allocation)

  • 동적 메모리 할당의 필요성
    • 실제 저장하는 요소가 선언된 크기보다 작을수록 메모리 낭비가 심해진다.

    • 메모리 할당의 인위적인 제한을 가진다는 단점이 있다.

    • 메모리 효율적인 관리 가능

프로그램이 실행되는 도중인 런 타임(run time)에 사용자가 직접 결정

 

  • 동적 할당 함수  -  <stdlib.h> 헤더 파일을 참조한다

함수 구분 예시
malloc() 원형 void *malloc (unsigned int size);
기능 size 바이트 수 만큼 할당하고 시작 위치 반환 
사용 형태 int *p = (int *) malloc(sizeof(int));
calloc() 원형 void *calloc (unsigned int cnt, unsigned int size);
기능 (cnt *size) 바이트 수 만큼 할당하고 0으로 초기화한 후 시작 위치 반환
사용 형태 double *p = (double *) calloc (5, sizeof(double));
realloc() 원형 void *realloc (void *p, unsigned int size);
기능 p가 연결한 영역의 크기를 size 바이트의 크기로 조정하고 시작 위치 반환
사용 형태 char *p = (char *) realloc (p, 2*strlen(str));
free() 원형 void free (void *p);
기능 p가 연결한 영역 반환

1) 동적 할당 공간은 변수와 달리 이름이 없어서 포인터에 주소를 대입하여 사용한다.

2) 동적 할당을 요청한 후,  할당되었는지 반환값을 확인해야 한다.

3) 사용이 끝난 동적 할당 공간은 재활용을 위해 반환한다.

4) 동적 할당한 저장 공간을 배열처럼 쓸 때는 포인터가 배열명 역할을 한다.

 

▶ malloc(), calloc(), realloc() 함수 : 메모리 할당 함수

▶ free() 함수 : 힙 영역에 할당했던 메모리를 운영체제에 반환하는 메모리 반환 함수 

 

 

참고 : 든든한  C Programming( 김원선 지음 )

'Programming Language > C language' 카테고리의 다른 글

파일 입출력  (0) 2019.07.10