본문 바로가기
c언어

c언어 calloc()과 realloc()에 대하여 알아보기

by 개발자 L 2023. 2. 27.
반응형

c언어 calloc()과 realloc()에 대하여 알아보기

네 안녕하세요, 이번 포스팅에서는 calloc()과 realloc()에 대하여 알아보도록 하겠습니다.

calloc()과 realloc()도 상황에 따라서 쓰이는데,

종종 쓰이는 동적 메모리 할당 명령어이기 때문에 알아두셔야 합니다.

그럼 지금부터 시작해 보도록 하겠습니다.

 

1. calloc()

calloc()은 0으로 초기화된 동적 메모리를 할당합니다.

보통 초기화가 된 메모리 블록을 얻고자 할 때 씁니다.

사용 방법은 이렇습니다.

int *p;
p = (int *)calloc(5, sizeof(int));

이런 식으로 쓰게 되면 동적 메모리가 할당이 된 공간만큼 초기화가 된 메모리를 할당합니다.

여기서는 제가 5라고 적어뒀는데, 5 바이트 만큼의 초기화된 메모리 공간을 할당받게 됩니다.

반응형

 

2. realloc()

realloc()은 이름 그대로 할당했던 메모리 블록의 크기를 변경하는 함수입니다.

사용 방법은 이렇습니다.

int *p;
p = (int *)malloc(5 * sizeof(int));
p = realloc(p, 7 * sizeof(int)); // 5 바이트 만큼 할당된 공간을 7바이트로 변경

이런 식으로 씁니다.

이렇게 할당된 동적 메모리 공간이 좀 작거나 클 경우에 씁니다.

그럼 이를 이용해서 간단한 예제를 작성해보도록 하겠습니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    printf("정수 2개를 저장할 공간이 필요합니다.\n");

    int *list = (int *)malloc(sizeof(int) * 2);
    int i;
    int *list_new;

    list[0] = 10;
    list[1] = 20;

    printf("정수 3개를 저장할 공간으로 확장합니다.\n");

    list_new = (int *)realloc(list, sizeof(int) * 3); // 동적 메모리 할당 공간 변경

    list_new[2] = 30;

    for(i = 0; i < 3; i++)
    {
        printf("%d", list_new[i]);
    }

    printf("\n");

    free(list_new);

    return 0;
}

이렇게 작성했습니다.

여기서 주의해야 할 사항은, 할당받은 동적 메모리 공간을 list 대신에 list_new로 변경했기 때문에

나중에 반환을 받을 포인터 역시 list_new라는 것을 명심하셔야 합니다.

그럼 결과를 보도록 하겠습니다.

정수 2개를 저장할 공간이 필요합니다.
정수 3개를 저장할 공간으로 확장합니다.
10 20 30

결과도 잘 나온 것을 확인할 수 있습니다.

 

3. 동적 메모리를 꼭 반납해야 하는 이유

이전 포스팅에서도 동적 메모리 반납의 중요성을 늘 강조를 했는데요,

동적 메모리를 명시적으로 반납을 하지 않으면 동적 메모리가 할당이 된 것이 해제가 되지 않고 남아있게 됩니다.

그렇게 되면 동적 메모리의 크기가 정해져 있어서 그만큼 메모리 공간이 줄어든다는 것을 의미하고,

이로 인하여 전제 프로그램들의 속도가 느려지게 됩니다.

이렇게 되면 최악의 경우 운영체제가 멈출 수도 있어서 컴퓨터 자체를 아예 못 쓰게 될 수도 있습니다.

제가 하나의 예시 코드를 보여드리도록 하겠습니다.

void main()
{
	int *p;
    p = malloc(100 * sizeof(int));
    p = malloc(100 * sizeof(int)); // 이전 메모리 블록에 대한 주소가 사라짐.
    ...
    return;
}

이런 경우가 정말 잘못된 경우입니다.

이런 식으로 계속 반납을 하지 않고 할당만 하게 되면 소위 말하는 메모리 누수가 일어나서

기기들이 제 기능을 못하게 됩니다.

한 가지 예로 컴퓨터나 스마트폰이 어느 순간에 서서히 느려지고 있음을 느끼셨던 적이 있을 건데,

이럴 경우가 보통 메모리 누수로 인한 경우가 많고,

어디서 어떻게 메모리 누수가 일어나는지 잡기도 어려워서 보통 밀어버리는 경우가 대다수입니다.

그리고 이러한 메모리 누수는 시스템 재부팅을 하면 일시적으로 사라지는데,

이 역시 말 그대로 일시적일 뿐, 효과가 크지는 않습니다.

 

여기까지 calloc()과 realloc()에 대하여 알아보았습니다.

다음 포스팅에서는 연결 리스트에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다~

반응형

댓글