본문 바로가기
2학년 2학기/c언어

13-5장 realloc(), memset(), calloc()

by kkkkk1023 2024. 11. 25.

realloc

: 이미 할당 받은 메모리 값의 크기를 변경하는 것

 

realloc(이미 할당 받아서 사용하던 메모리 주소를 담고 있는 포인터, 변경하고 싶은 전체 크기)

 

 

예제

#include <stdio.h>
#include <stdlib.h>
#define SIZE 5

int main(void) {
    int i, cur = 0, curMSize = SIZE;
    int *p;

    // 초기 메모리 할당
    p = (int *)malloc(sizeof(int) * curMSize);
    if (p == NULL) {
        printf("메모리 할당 오류\n");
        exit(1);
    }

    while (1) {
        cur++;
        
        // 메모리 확장이 필요할 경우
        if (cur > curMSize) {
            curMSize = curMSize + SIZE;
            p = (int *)realloc(p, sizeof(int) * curMSize);
            if (!p) {
                printf("메모리 재할당 오류\n");
                exit(1);
            }
        }

        // 사용자 입력
        scanf("%d", &p[cur - 1]);
        if (p[cur - 1] == -1)
            break;
    }

    // 입력값 출력
    for (i = 0; i < cur; i++) 
        printf("%d\n", p[i]);

    // 동적 메모리 해제
    free(p);
    return 0;
}

 

 

위의 코드는 현재 할당된 메모리 범위를 벗어나면, 메모리를 점진적으로 realloc을 통해서 할당 메모리를 늘러나가는 코드이다. 

 


memset

: 할당 받은 메모리의 쓰레기 값을 전부 청소하는 역할을 한다.

 

 

memset(할당 받은 메모리의 주소를 가진 포인터, 청소를 하고 입력할 변수, 채울 바이트의 수)

 

 


calloc

: malloc과 기본적인 동작은 같지만, malloc은 메모리를 할당 받고 쓰레기 값을 그대로 두지만 calloc은 쓰레기 값을 0으로 변경한다. 따라서, 그 만큼 시간이 더 걸린다.

 

calloc(할당 할 원소의 수, 할당할 원소의 크기)

 

 

예제

#include <stdio.h>
#include <stdlib.h>
#define SIZE 10

int main(void) {
    int i, count = 0;
    int *p;

    p = calloc(SIZE, sizeof(int));
    if (p == NULL) {
        printf("메모리 할당 오류\n");
        exit(1);
    }

    for (i = 0; i < SIZE; i++) {
        scanf("%d", &p[i]);
        if (p[i] == -1) break;
        count++;
    }

    for (i = 0; i < count; i++) 
        printf("%d\n", p[i]);

    free(p);
    return 0;
}

 

 

 

 

 


calloc → malloc + memset

 

#include <stdio.h>
#include <stdlib.h>
#define SIZE 10

int main(void) {
    int i, count = 0;
    int *p;

    p = calloc(SIZE, sizeof(int));
    if (p == NULL) {
        printf("메모리 할당 오류\n");
        exit(1);
    }

    for (i = 0; i < SIZE; i++) {
        scanf("%d", &p[i]);
        if (p[i] == -1) break;
        count++;
    }

    for (i = 0; i < count; i++) 
        printf("%d\n", p[i]);

    free(p);
    return 0;
}

 

⬇️

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // memset을 위해 포함

#define SIZE 10

int main(void) {
    int i, count = 0;
    int *p;

    // malloc으로 메모리 할당
    p = malloc(SIZE * sizeof(int));
    if (p == NULL) {
        printf("메모리 할당 오류\n");
        exit(1);
    }

    // memset으로 메모리를 0으로 초기화
    memset(p, 0, SIZE * sizeof(int));

    for (i = 0; i < SIZE; i++) {
        scanf("%d", &p[i]);
        if (p[i] == -1) break;
        count++;
    }

    for (i = 0; i < count; i++) 
        printf("%d\n", p[i]);

    free(p);
    return 0;
}