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;
}
'2학년 2학기 > c언어' 카테고리의 다른 글
13-7장 메모리 누수(1)_fread가 실패해서 free를 실행하지 못하는 경우 (0) | 2024.11.26 |
---|---|
13-6장 동적 할당에서의 대표적인 오류들 (0) | 2024.11.25 |
13-4장 구조체 동적 생성 (0) | 2024.11.25 |
13-3장 동적 할당 영역을 배열처럼 쓰기 (0) | 2024.11.19 |
13-2장 malloc()과 free() (0) | 2024.11.19 |