
메모리 공간을 나눠놓음(유사한 성향의 데이터끼리 묶어서 저장)
코드영역
실행할 프로그램의 코드가 저장되는 메모리 공간이다.
CPU는 코드 영역에 저장된 명령문들을 하나씩 가져가서 실행한다.
데이터영역
전역변수와 static으로 선언되는 static 변수가 할당됨
시작과 동시에 메모리공간에 할당되어 프로그램 종료시까지 남아있다.
스택영역
지역변수와 매개변수가 할당됨
선언된 함수들을 빠져나가면 소멸된다.
힙영역
C언어는 프로그래머가 원하는 시점에 변수를 할당하고 소멸하도록 지원한다.
힙영역은 이러한 유형의 변수들이 할당되는 영역이다.
우리가 원하는 것은
"함수가 매번 호출될 때마다 새롭게 할당되고 또 함수를 빠져나가도 유지가 되는 유형의 변수"
동적 할당은 실행중에 필요한 메모리양만큼만 할당하여 유연성과 메모리 효율성을 제공한다.
malloc 함수의 반환형은 void형 포인터이다. 따라서 (int *), (double *) 등의 형변환으로 할당된 메모리 공간에 접근해야 한다.
ex> int ptr1 = (int )malloc(sizeof(int));
#include <stdio.h>
#include <stdlib.h>
int main()
{
int * ptr1 = (int *)malloc(sizeof(int));
*ptr1 = 20;
free(ptr1);
return 0;
}
int * ptr = (int *)malloc(sizeof(int));
if(ptr==NULL)
{
// 메모리 할당 실패에 따른 오류처리
}
Q: free함수를 반드시 호출해야 하는가?
A: 프로그램 싱행시 할당된 모든 메모리 공간은 프로그램이 종료되면 운영체제에 의해서 전부 해제가 된다.
그러나 복잡한 프로그램에서는 free함수를 호출하여 메모리 공간을 절약하는 것이 필요하다.
realloc함수는 한번 할당된 메모리 공간의 크기를 확장한다.
int * arr = (int*)malloc(sizeof(int)*3);
arr = (int*)realloc(arr, sizeof(int)*5); // 길이가 5인 int형 배열로 확장