Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

냥집사의 개발일지

C언어 - 메모리 동적 할당 (calloc, realloc) 본문

C언어

C언어 - 메모리 동적 할당 (calloc, realloc)

깅햄찌 2022. 9. 21. 20:46
반응형

안녕하세요 오늘은 메모리 동적 할당 2탄 calloc과 realloc에 대해 정리해보겠습니다.

2022.09.20 - [C언어] - C언어 - 메모리 동적 할당 (malloc)

 

C언어 - 메모리 동적 할당 (malloc)

안녕하세요 오늘은 메모리 동적 할당에 대해 정리해보겠습니다. 일반적인 정적 할당은 Compile 단계에서 할당되지만 동적 할당은 runtime 시 메모리에 할당되는 특징이 있는데요. 먼저 메모리 동적

leggo-fire.tistory.com

메모리 동적 할당 1탄도 참고하세요~

 

1. calloc

calloc의 원형 : void *calloc(unsigned int count, unsigned int size);

malloc의 매개변수가 size 1개였던 것과 달리 calloc는 count와 size 2개의 매개변수를 가집니다.  

calloc은 (count * size)만큼의 byte를 할당하고 0으로 초기화 한 뒤 시작 주소를 반환합니다.

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

int main(){
    int *pi;

    pi = (int *)calloc(5, sizeof(int));
    if(pi == NULL){
        printf("out of memory");
        exit(1);
    }

    for(int i=0; i<5; i++){
        printf("pi[%d] : %d\n",i, pi[i]);
    }
    
    free(pi);

    return 0;
}

calloc으로 메모리 할당 후 초기화를 따로 하지 않았음에도 0으로 이미 초기화되었음을 확인할 수 있었습니다. 

 

2. realloc

realloc의 원형 : void *realloc(void *p, unsigned int size);

포인터 변수 p가 연결한 영역의 크기를 size 크기의 byte로 조정하고 시작 위치를 반환합니다.

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

int main(){
    int *pi;
    int size = 5;
    int count = 0;
    int num;

    
    pi = (int *)calloc(size, sizeof(int));
    if(pi == NULL){
        printf("out of memory");
        exit(1);
    }

    while(1){
        printf("ONLY input positive num!! : ");
        scanf("%d", &num);
        if(num <= 0){
            break;
        }
        if(count == size){
            size+=5;
            pi = (int *)realloc(pi, size * sizeof(int)); //reallocate where pi points (size * sizeof(int) byte -> (size+5) + sizeof(int) byte)
            if(pi == NULL){
                printf("out of memory");
                exit(1);
            }
        }
        pi[count++] = num;
    }

    for(int i=0; i<5; i++){
        printf("pi[%d] : %d\n",i, pi[i]);
    }

    printf("size of pi points %d\n", _msize(pi));
    
    free(pi);

    return 0;
}

1. calloc 함수로 동적 할당한 공간 20(5*sizeof(int))byte를 pi로 가리키게 한다. 

2. 무한루프 안에서 양수인 정수를 입력한다. (음수를 입력하면 루프를 벗어난다.)

3. 기존에 할당된 20byte를 넘게 입력이 들어오면 (5개 넘는 정수가 입력되면)

     realloc 함수를 이용하여 메모리 공간을 재할당한다. 

4. 입력된 정수는 순차적으로 메모리 공간에 할당 된다. 

5. _msize 함수는 포인터가 가리키는 공간의 크기를 반환한다. 

 

아래 결과를 보면 1,2,3을 입력하여 처음 할당된 공간 20byte를 초과하지 않으므로

pi가 가리키는 메모리 공간은 여전히 20byte인것을 확인할 수 있습니다. 

아래 결과를 보면 1,2,3,4,5,6을 입력하여 처음 할당된 공간 20byte를 초과했으므로 realloc 함수로 재할당 되었습니다. 

pi가 가리키는 메모리 공간은 40byte인것을 확인할 수 있습니다. 

오늘은 메모리 동적 할당 2탄 calloc과 realloc에 대해 정리해보았습니다.

오늘 예제를 통해 변수의 크기를 알 수 없을 때 왜 동적 할당이 유용한지 알 수 있었습니다. 

찾아보진 않았지만 c++의 vector함수도 realloc의 기능을 하는 함수를 포함하고 있지 않을까요?

 

다음은 동적 할당을 사용하여 문자열 처리에 관한 포스팅을 하고자 합니다. 

 

좋은 하루 보내세요~ 

감사합니다!!

Comments