본문 바로가기

C 언어 함수

메모리 resize 할 때는 realloc 함수

realloc 함수는 이미 할당된 메모리 블록의 크기를 변경하는 데 사용된다.

C 프로그래밍에서는 malloc 또는 calloc을 사용하여 동적으로 메모리를 할당받은 후, 이 메모리의 크기를 조정할 필요가 있을 때 realloc을 사용할 수 있다.

realloc 함수의 사용법

void* realloc(void* ptr, size_t new_size);


ptr: 이미 할당된 메모리 블록을 가리키는 포인터
new_size: 변경하고자 하는 새로운 메모리 크기

반환 값은 성공이면 새롭게 조정된 메모리 블록을 가리키는 포인터를 반환하고 실패하면 NULL 을 반환한다. 

 

주의사항
메모리 복사: realloc이 새로운 메모리 영역을 할당하고 원래 데이터를 새 위치로 복사하는 경우, 이전의 메모리 주소는 자동으로 해제된다. 새 메모리 블록의 위치는 기존 메모리 블록의 위치와 다를 수 있으므로, 반환된 새 포인터를 사용해야 쓰레기값이 나오지 않는다. 

 

<예시 코드> 

문자를 빼고 숫자만 추출한 후 오름차 순으로 정렬하여 출력하는 코드 (from 프로그래머스)

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

// 주어진 문자열에서 숫자만 추출하여 정수 배열로 반환
int* solution(const char* my_string) {
    size_t len = strlen(my_string); 
    int* answer = (int*)malloc(sizeof(int) * len); // 숫자가 모두 있을 최대 길이
    int count = 0;

    if (answer == NULL) {
        printf("메모리 할당 실패\n");
        return NULL;
    }
    
    for (int i = 0; i < len; i++) {
        if (my_string[i] >= '0' && my_string[i] <= '9') { // 문자가 숫자인지 확인
            answer[count++] = my_string[i] - '0'; // 문자를 숫자로 변환
        }
    }

    // 버블 정렬 로직 수정
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - i - 1; j++) {
            if (answer[j] > answer[j + 1]) {
                int temp = answer[j];
                answer[j] = answer[j + 1];
                answer[j + 1] = temp;
            }
        }
    }

    if (count > 0) {
        // 실제 숫자 개수만큼 메모리 크기 조정
        int* resized = realloc(answer, sizeof(int) * count);
        if (resized != NULL) {
            answer = resized;
        } else {
            free(answer);
            return NULL;
        }
    } else {
        // 숫자가 없는 경우
        free(answer);
        return NULL;
    }

    return answer;
}

int main(void) {
    const char* my_string = "hi12392";
    int* result = solution(my_string);
    int count = 0; 
    
    if (result != NULL) {
        // 결과 출력
        int i = 0;
        while (i < count) {  // 수정된 조건
            printf("%d", result[i]);
            if (i < count - 1) printf(", ");
            i++;
        }
        free(result); // 메모리 해제
    } else {
        printf("결과 없음 또는 메모리 할당 실패\n");
    }
    
    return 0;
}