메모리 영역별로 저장되는 데이터 유형


코드영역 : 코드가 저장되는 공간. CPU는 코드영역에 저장된 명령문들을 하나씩 가져가서 실행한다.


데이터영역 : 전역변수와 static 으로 선언된 변수가 할당된다. 이 영역에 할당되는 변수들은 프로그램 시작과 동시에 메모리공간에 할당되어 프로그램 종료시까지 남아있게된다.


스택영역 : 지역변수와 매개변수가 할당된다. 이 영역에 할당되는 변수들은 선언된함수를 빠져나가면 소멸된다는 특징이있다.


힙 영역 : 프로그래머가 원하는 시점에 변수를 할당하고  , 원하는 시점에 변수를 소멸시킬수 있도록 지원하는 영역이다.


메모리의 동적할당


함수가 매번 호출될 때 마다 새롭게 할당되고 또 함수를 빠져나가도 유지가 되는 유형의 변수가 필요할때 , malloc과 free라는 이름의 함수를 통해서 힙 영역에 할당하고 소멸할 수 있다.


#include <stdlib.h>

void * malloc (size_t size); // 힙영역으로의 메모리공간 할당

void free (void * ptr) // 힙영역에 할당된 메모리 공간해제


malloc 함수는 성공시 할당된 메모리의 주소값을 반환하고, 실패시 NULL을 반환한다. // malloc 함수를 이용해 힙에 할당된 메모리공간은 포인터변수를 이용해서 접근하는 방법밖에 없다.

free함수를 사용해 메모리를 해제해주지않아도 프로그램 종료시 할당된 메모리는 해제되지만, 메모리값을 사용하지 않아도될때는 반드시 free함수를 이용하는 습관을 들이는것이 좋다.

malloc에는 크기정보만이 전달되기때문에 void * 자료형으로 반환하고 , void *자료형으로는 아무런 연산이 불가능하므로 할당할 메모리의 자료형을 따로 정해줘야한다.


ex)

int * ptr = (int*)malloc(sizeof(int));

double * ptr  = (double*)malloc(sizeof(double));

int * ptr = (int *)malloc(sizeof(int)*7); // 이때 sizeof(ptr)의 크기는 sizeof(int)*7이 아니다


malloc 함수는 메모리공간의 할당에 실패할 경우 NULL 을 반환하므로, 메모리 할당의 여부를 확인할때는


if(ptr == NULL)

{

// 메모리할당실패시 오류처리

}

이런식으로 확인 가능하다


calloc함수


#include <stdlib.h>

void * calloc(size_t elt_count,size_t elt_size); //성공시 할당된 메모리의 주소값, 실패시 NULL반환


malloc 함수가 size 만큼의 바이트를 메모리에 할당하는 함수라면 , calloc 함수는 elt_size 만큼의 블록 elt_count 개를 힙영역에 할당하는 함수이다. 둘은 결과적으로 완전히 동일하지만, malloc 함수는 할당된 메모리 공간을 별도의 값으로 초기화하지않아 쓰래기값으로 채워지지만, calloc 함수는 모든 비트를 0으로 초기화한다. calloc 함수를 해제할때도 free 함수를 사용하면 된다.


힙에 할당된 메모리공간 확장시 : realloc 함수


#include <stdlib.h>

void * realloc( void *ptr , size_t size ); // 성공시 새로 할당된 메모리의 주소값 , 실패시 NULL 반환

ptr이 가리키는 메모리의 크기를 size 크기로 조절한다

할당된 메모리를 확장하는건 힙영역에서만 가능하다.


ex)


int * arr = (int *)malloc(sizeof(int)*3); // 길이가 3인 int형 배열 선언

arr = realloc(arr,sizeof(int)*5); // arr을 길이가 5인 배열로 확장


이때 , arr배열뒤에 넉넉한 메모리가 남아있다면 arr의 주소값은 변하지않지만, 그렇지 않은경우 다른 주소값이 할당된다.


+ Recent posts