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;
}
'C 언어 함수' 카테고리의 다른 글
부분 문자열 비교 함수 strstr (0) | 2024.04.22 |
---|---|
삼항 연산자 사용하기 (1) | 2024.04.21 |
C 언어에서 정수를 문자열로 변환하기: sprintf와 %d 형식 지정자 활용법 (0) | 2024.04.21 |
C 언어에서 bool 함수 사용하기 (0) | 2024.04.14 |
문자열 관련 함수 (0) | 2024.02.14 |