Computer Science/C\C++

[C언어] 메모리 공간의 동적 할당

hyunjin 2021. 5. 19. 18:47

가상메모리의 4대 영역

{ 코드영역, 데이터영역, 힙영역, 스택영역 }

코드 영역: 실행할 프로그램의 코드 저장 공간

데이터영역 : 프로그램이 종료될 때까지 유지할 데이터 저장 공간

힙 영역 :  프로그래머가 원하는 형태로 쓸 수 있는 공간

스택 영역 : 잠깐 사용하고 삭제할 데이터 저장 공간

 

정적 메모리 할당

-프로그램이 시작되기 전에 미리 정해진 크기의 메모리를 할당

-할당된 크기보다 더 큰 입력은 X

-작은건 메모리 낭비

ex) int i, j;

     int buffer[80];

     지역변수, 전역변수 

 

동적 메모리 할당

-실행 도중에 메모리 할당

-사용 끝나면 메모리 반납

-malloc() 계열의 라이브러리 함수를 사용

 

*run-time때 배열의 크기를 정하기 위해서는 배열을 힙 영역에다가 할당해야 함.

 

-배열을 생성해서 반환하는 함수의 기본 조건 : 함수 내에 선언된 배열이 함수 반환 후에도 소멸되지 않아야 함 -> 힙 영역에 활용

  

-힙 영역에 대한 이해 :

(1) 사용자가 할당, 소멸

(2) 원하는 순간에 할당, 소멸

(3) 메모리가 자동으로 소멸되지 않음

 

힙 영역에 할당할 때 : malloc 

- 힙 영역에 메모리 공간 할당

- 호출 시 전달되는 수의 크기만큼 바이트 단위로 할당 후 할당된 주소 값 반환

- 포인터 연산 필수

- 할당 실패 시 NULL 반환

 #include <stdlib.h>

void * malloc(size_t size); //void-지정되어있지않음

//malloc(n*sizeof(int));//이런식으로 많이 씀

 

-malloc함수는 주소값의 포인터 형을 결정하지 못한다.

-(void *)는 가리키는 대상의 정보가 담겨있지 않은, 단순히 주소 값 정보만을 담을 수 있는 변수임.

-따로 포인터 형을 직접 결정해줘야함

ex) int * p = (int *)malloc(3*sizeof(int)); //3개의 정수 할당

 

할당받은 공간 사용

(1) 포인터를 통하여 사용

(2) 동적 메모리를 배열과 같이 취급

 

free 함수

-힘에 할당된 메모리 공간의 해제를 위한 함수

-전달인자는 malloc 함수의 반환 값

-NULL전달되면 아무사건 X

void free(void* ptr);

 

 

#include <stdio.h>
#include <stdlib.h>

int main(void) {
	int* pi;     // 동적메모리를가리키는포인터
	pi = (int* )malloc(sizeof(int)); // ①동적메모리할당
    
   	if (pi == NULL){     // 반환값이NULL인지검사
   	printf(“동적메모리할당오류\n”);
   	exit(1);
		}
    
     	*pi=100;     // ②동적메모리사용
   	printf(“%d\n”, *pi);
   	free(pi);    // ③동적메모리반납
    	return 0;
}

 

calloc함수(malloc과 다르게 초기화해줌)

-모든 메모리 공간을 0으로 초기화

-쓰레기값이 사용될 위험을 줄임

-똑같이 free함수 사용

-입력인자가 2개

#include <stdlib.h>

void * calloc(size_t elt_count, size_t elt_size);

                           ↑               ↑

                     몇 개(n)        자료형의 사이즈(sizeof(TYPE))

 

 

realloc함수

-할당했던 메모리 블록의 크기 변경

int* p;

p = (int* )malloc(5 *sizeof(int));

p = realloc(p, 7 *sizeof(int));