[자료구조] 포인터를 이용한 동적 메모리 할당

2021. 4. 25. 12:44
728x90

 

동적 메모리 할당 (Dynamic Memory Allocation)

: 프로그램 실행 도중 동적으로 메모리를 할당하는 것

 

동적 : 할당될 메모리의 크기가 컴파일할 때 미리 정해져 있지 않았다는 의미

- 정적메모리 할당(Static Memory Allocaion)

: 프로그램이 실행되기 전에 할당해야 할 메모리의 크기가 미리 정해진 경우

 

//정적 메모리 할당의 잘못된 예

int size= 100;
int int_array[size] = {0,};		//오류발생

동적메모리 할당을 위의 소스 처럼 실행하면 오류가 발생한다.

방법 1) 정적메모리 할당 방법 2) 동적 메모리 할당
int int_array[100] = {0, }; int *ptr_int = NULL;
int size = 100;

....
size = 200;
ptr_int = (int*) malloc(sizeof(int)*size);

malloc을 이용하여 동적 메모리 할당을 해야한다!

 

동적 메모리 할당의 단점

  • 소스코드가 복잡하다
  • 사용방법이 정적 메모리 할당에 비해 다소 어렵다
  • 메모리를 다 사용한 다음 반드시 메모리를 해제 시켜주어야한다.
    • 메모리 누수(memory leak)

동적 메모리 할당 관련 함수 3가지

- malloc() : 메모리 할당

- free() : 메모리 해제 **

- memset() : 메모리 초기화 **

 

함수 malloc()을 이용한 메모리 할당

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

동적 메모리 할당 방법

ptr_int = (int*)malloc(sizeof(int)*size); 

(int*) : 형변환

malloc ( sizeof(int)  [ -> int의 사이즈 , 4 ] * size[원소의 개수] );

ptr_int = (int*)malloc(sizeof(int)*size);

if(ptr_int != NULL){
	//명령문 실행
}
else{
	//에러
}

NULL인경우 오류가 발생하기 때문에 NULL 체크를 반드시 해주어야한다.

 

함수 free() 를 이용한 메모리 해제

#include <stdlib.h>
void free(vode *ptr);
if(ptr_int != NULL){
	//포인트 변수에 값이 있는 경우 메모리 해제
    free(ptr_int);
}

포인트 변수가 널인경우 free() 할 경우 프로그램이 종료된다

 

함수 memset()을 이용한 메모리 초기화

#include <stdlib.h>
void *memset(vode *ptr_start,int value, size_t count);

*memset(시작주소, 값, byte);

 

동적 메모리 할당 예제

int *ptr_int = NULL;
int size = 100;

ptr_int = (int*)malloc(sizeof(int)*size); //400
if(ptr_int != NULL){
  memset(ptr_int,0,sizeof(int)*size); // 초기화
  //로직처리
  free(ptr_int); // 사용된 동적할당 포인터변수 초기화
}

 

반응형

BELATED ARTICLES

more