C언어의 메모리 구조, 동적할당 malloc, callloc

프로그램이 실행되려면 메모리 공간이 필요하다.
운영체제는 프로그램을 실행시킬 때 메모리 공간을 할당 해 준다.

메모리 공간 : 스텍 Stack, 힙 heap, 데이터 data 영역

DATA 데이터 영역 - 전역변수, static변수 // 프로그램이 시작될 때 할당되어 종료될 때 까지 유지
heap 힙 영역 - 프로그래머가 할당 // ***메모리 동적 할당에서 활용되는 영역
stack 스텍 영역 - 지역변수, 매개변수 // 함수 호출이 완료되면 할당 영역이 사라진다

배열은 상수로 선언되어야 하는 이유 577p
스텍되 데이터 영역에 할당될 메모리 크기는 컴파일타임(compile-time)에 결정되야하기 때문에
누구나 한번씩 생각 해 보는 배열의 선언인...

int arr[i]
scanf("%d", &i);

이런 형태의 선언은 에러가 발생한다.

malloc 함수 & free 함수 메모리 동적 할당-----------------------581p

malloc
동적으로 메모리를 할당하는 함수--heap영역에 메모리를 할당

#include <stdlib.h>
void* malloc(size_t size)
성공시 할당된 메모리의 첫번째 주소 리턴, 실패 시 NULL포인터 리턴

사용 방법

#include
#include

void function(int);
int main(void)
{
int m=0;
fputs("배열의 크기를 입력하세요: ", stdout);
scanf("%d", &m);
function(m);

return 0;
}

void function(int i)
{
//int array[i]; //ProbArray.c에서의 문제점
int* array = (int*)malloc(sizeof(int)*i);
int j;
if(array==NULL)
{
puts("메모리 할당에 실패!");
exit(1); //비 정상적 종료를 의미함
}
/*동적 할당한 메모리 사용*/
for(j=0;j
array[j]=j+1;
for(j=0;j
printf(""%d", array[j]);
printf("\n");

free(array); // 할당된 메모리 소멸
}


calloc

#include <stdlib.h>
void *calloc(size_t elt_count, size_t elt_size)
성공 시 할당받은 메모리의 포인터(void*형), 실패 시 NULL 리턴


malloc 과 사용방법은 거의 동일하다.

int *arr = (int*)calloc(size,sizeof(int));
==
int *arr = (int*)malloc(size*sizeof(int));