반응형
[ 동적할당 ]
- 동적할당이라는 것은 프로그램 실행중에 동적으로 메모리를 할당하는 것을 말한다.
- 여기서 중요한것은 동적으로 메모리를 할당할때 Heap(힙)영역에 할당한다는 것이다.
# 함수원형
void* malloc(size_t size)
- 해당함수를 사용하기 위해서는 <stdlib.h> 헤더파일을 include해야한다.
- 함수 동작은 매개변수에 해당하는 size_t 만큼의 크기만큼 메모리를 할당하고
- 성공하면 : 할당한 메모리의 첫 번째 주소 리턴
- 실패하면 : NULL 리턴
- 제일 중요한점 !!
- 할당한 메모리는 꼭 해제해주어야한다.!!
- 그렇지 않으면 메모리 릭, 메모리 누수가 발생한다.
함수 원형
- 메모리 할당
void *malloc(size_t size);
- 할당받을 메모리 크기를 인자로 받는다
- ex) int * arr = (int *)malloc(sizeof(int)*n); // 인자의 개수가 n개의 배열을 동적할당한다.(그만큼의 메 모리할당한다)
- 메모리 할당 및 초기화
void *calloc(size_t nelem, sizeo_t elsize);
- 첫번째 인자 배열요소 갯수, 두번째 인자 각 배열요소 사이즈
- 할당된 메모리 0으로 초기화
- 메모리 추가할당
void *realloc(void *ptr, size_t size);
- 이미 할당받은 메모리에 추가로 메모리 할당, 이전 메모리 주소 없어짐
- 메모리 해제 함수
void free(void *ptr);
- 할당한 메모리를 해제한다.
- 할당한 메모리를 제대로 해제 해주지 않으면 메모리 누수(메모리 닉)이 발생할 수 있다.
- free(arr); // malloc으로 할당한 메모리를 해제한다.
예제1
사이즈가 정해진 배열 복사
// C code
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int arr[4] = {4,3,2,1}; // 크기가 4인 배열 선언
int * pArr; // int 타입을 가리키는 포인터 pArr 선언
// int 타입 사이즈 * 4 만큼의 메모리를 할당하라!
pArr = (int *)malloc(sizeof(int)*4);
if(pArr==NULL)
{
//메모리 할당에 실패하면 이쪽으로 들어옵니다.
printf("malloc error");
}
for(int i=0; i<4; ++i)
{
pArr[i] = arr[i];
}
for(int i=0; i<4; ++i)
{
printf("%d \n", pArr[i]);
}
//할당한 메모리를 해제해줍니다.
free(pArr);
system("pause");
return 0;
}
// result
4
3
2
1
// analysis
int* pArr = (int *)malloc(sizeof(int)*4);
- (int *) : malloc의 반환형이 void*이므로 (int *)형태로 형변환
- sizeof(int) : sizeof()는 괄호 안에 자료형 타입을 바이트로 연산해주는 연산자
- sizeof(int)*4 : 위에 선언한 arr[4] 사이즈가 가지고 있는 동일한 크기의 메모리를 할당하기 위해 int 타입 곱하기 4를 해준 것
예제2
과목의 점수 받고, 평균점수 내기
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int num;
int *pArr;
int average = 0;
printf("몇개의 과목을 저장할 것인가 자네 : ");
scanf("%d", &num);
//0개 넣으면 프로그램 종료해
if(num==0)
{
return 0;
}
//과목 개수만큼 메모리 동적할당을 한다!!
pArr = (int*)malloc(sizeof(int)*num);
//동적할당 실패
if(pArr == NULL)
{
printf("malloc error");
exit(1);
}
//점수를 받고 저장한다.
for(int i=0; i<num; ++i)
{
printf("[%d/%d]점수입력 : ", i+1, num);
scanf("%d", &pArr[i]);
}
//출력
for(int i=0; i<num; ++i)
{
printf("%d번째 과목의 점수 : %d\n", i+1, pArr[i]);
}
//평균 출력
for(int i=0; i<num; i++)
{
average += pArr[i];
}
//정수로 나누어지기 때문에 소수점 이하는 버려진다.
average /= num;
printf("평균 : %d\n", average);
//동적할당 해제
free(pArr);
system("pause");
return 0;
}
반응형
'프로그래밍 언어 > [ C ]' 카테고리의 다른 글
[ C ] 05. 메모리와 포인터의 사용 (0) | 2020.08.13 |
---|---|
[ C ] 04. 포인터의 형변환 (0) | 2020.08.13 |
[ C ] 03. 포인터와 역참조 연산자 (0) | 2020.08.13 |
[ C ] 02. 문자열 관련 자주 쓰이는 함수 (0) | 2020.08.13 |
[ C ] 00. 함수 호출방식 (1) | 2020.08.13 |