메모리 영역 |
- Stack 영역 : 어떤함수안에 변수가 선언되면 스택영역안의 그 함수의 영역에 변수가 저장된다. 함수마다 스택영역안에 자신의 스택영역이 있다.
하지만 한 함수에 변수가 선언될수있는 스택영역은 제한이 있다. 따라서 함수안에 변수가 일정개수 이상이면 에러가 나게 된다. 함수 안에 크기가 엄청큰 배열을 선언했다가 에러가 난 경험이 있을것이다. 그것이 이같은 경우이다. 스택영역은 프로그램 수행중에 메모리영역을 바꿀수 없다.
- Heap 영역: 스택영역과 달리 변수선언개수에 제한이 없다. 동적으로 메모리를 할당할 경우 힙영역에 메모리가 할당된다. 힙 영역은 공유메모리(같이 쓰는공간)이기때문에 요청을 하고 반납을 해주어야한다. 힙영역은 프로그램 수행중에 메모리 요청이 가능하다.
동적 메모리 할당 |
#include<stdlib.h>혹은 #include<malloc.h>를 참조해 주자.
포인터 변수 = (포인터변수의 데이터 타입)malloc(할당받을 메모리영역의 바이트 갯수);
int n,* ptr
ptr = (int *)malloc(100);
위와같이 프로그래밍을 하면 포인터변수 ptr에는 malloc함수실행에따른 할당된메모리의 첫주소가 들어가게된다. malloc함수가 메모리 영역을 할당해주고 그 메모리영역의 첫주소를 반환해 주기때문이다. malloc함수 앞에 캐스팅을 해준이유는 ptr이라는 포인터변수의 데이터타입에 맞게 주소를 전달해야되기때문이다.
malloc함수의 인자값은 할당받을 메모리영역의 바이트 갯수를 말한다. 위에서 100을 인자값으로 넘겨주었기때문에 100byte의 메모리가 할당된다.
하지만 여느 코드를보면
ptr = (int *)malloc(sizeof(int)*n)
위와같은 코드를 자주 볼수 있다.
매개변수로 정수값이아니닌 sizeof(int)*n을 넘겨 주었다.
이뜻은 int가 n개 들어갈수 있는 메모리를 할당해 달라는 말이다. 즉 만약 n=10이라면, int arr[10]; 와 비슷하게 메모리를 할당받을수있다는 것이다.
이때 포인터 변수ptr에 메모리주소값이아닌 NULL이 들어가는 경우도 있는데 그경우는 malloc함수가 메모리를 할당해주지못해 에러가 났을때 NULL값을 반환해주는것이다.
동정할당의 경우도 배열처럼
ptr[0]
ptr[1]
와 같은 인덱스 접근이 가능하다.
메모리를 다 사용했을경우에는 free(ptr); 과 같이 반납을 해주어야한다.
정적메모리할당에서는 int arr[n]과 같이 크기지정할때 변수값을 사용할 수없다. 프로그램 수행전에 스택영역에 변수를 저장해야하는데 n은 변하는 값이기때문이다.
하지만 동적 메모리할당에서는 프로그램수행중 어디서나 메모리를 요청할수있다.
'FALL in > G.MA' s C' 카테고리의 다른 글
[C프로그래밍] - 문자배열과 포인터 (0) | 2016.04.10 |
---|---|
[C프로그래밍] - Call by Value vs. Call by Reference (0) | 2016.03.29 |
[C프로그래밍] - 재귀호출 (2) | 2016.03.28 |
[C프로그래밍] - 포인터 (0) | 2016.03.27 |
[C프로그래밍] - 구조체 (0) | 2016.03.27 |