프로그래밍 언어/[ C ]

[ C ] 01. 동적할당이란?

kim.svadoz 2020. 8. 13. 09:57
반응형

[ 동적할당 ]


  • 동적할당이라는 것은 프로그램 실행중에 동적으로 메모리를 할당하는 것을 말한다.
  • 여기서 중요한것은 동적으로 메모리를 할당할때 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;
}
반응형