출처 | DO IT 자료구조와 함께하는 알고리즘 입분
메모리 구조에 대해서 알아보자.
프로그램을 실행하면 운영체제는 사용할 메모리 영역을 할당한다.
할당하는 메모리 영역은 크게 3가지가 있다. (데이터, 스택, 힙)
필요에 따라 동적으로 메모리를 할당핟나.(malloc, calloc)
힙 영역은 할당해야 할 메모리 영역의 크기를 프로그램이 실행하는 동안 (run time) 결정하는 경우에 사용한다.
동적 할당을 통해 생성된 동적 변수를 관리하기 위한 영역이다.
calloc, malloc 함수는 힙이라는 특별한 빈 공간에 기억 장소를 확보한다. (&free와 함께 사용한다.)
malloc은 할당과 동시에 초기화를 해주지 않는 반면 calloc은 NULL값으로 초기화를 해준다.
그리고 사용시 인자로 malloc은 (1*sizeof(char)) 처럼 할당할 전체 데이터의 크기가 들어가는 반면,
calloc은 (1, sizeof(char)) 로써 첫 번째 인자로 몇 개를 할당할 것인지와 두 번째 인자로써 각 할당된 개수의 크기를 설정한다.
calloc 함수는 자료형을 지정한 명령을 사용할 필요가 없다.
calloc 함수가 확보하는 것은 특정한 자료형의 객체가 아니라 단순히 메모리 영역이다.
다음 예제를 보자.
#include <stdio.h>
#include <malloc.h>
int main()
{
int* p;
p = calloc(1, sizeof(int));
if (p == NULL)
{
printf("메모리가 할당되지 않았습니다.");
}
else
{
*p = 60;
printf(" *p = %d\n", *p);
}
free(p);
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, * a, na;
printf("요소의 개수 : ");
scanf_s("%d", &na);
a = calloc(na, sizeof(int)); - 요소 개수가 na인 int형 배열을 생성했다.
if (a == NULL)
{
puts("메모리 확보를 실패했습니다 : ");
}
else
{
printf("%d개의 정수를 입력하세요 : \n", na);
for (i = 0; i < na; i++)
{
printf("a[%d] : ", i);
scanf_s("%d", &a[i]);
}
printf("요소 값은 다음과 같습니다.\n");
for (i = 0; i < na; i++)
{
printf("a[%d] = %d\n", i, a[i]);
}free(a);
return 0;
}
}