2023.1.19. 최초 작성
필요한 순간에 필요한 크기만큼 메모리를 할당받아 사용하고자 할 때는 동적할당이란 개념이 적용되어 메모리의 힙(heap) 영역에 공간을 할당받는다.
포인터를 활용해 동적할당 된 메모리공간의 주소를 기억하고 접근할 수 있고 동적할당을 위해 malloc, calloc, realloc, free 이렇게 4가지 함수를 사용하는데 stdlib.h 헤더 파일에 포함되어 있다.
아래 코드는 malloc과 calloc 함수를 이용하여 입력된 학생 수에 맞게 동적 할당한 예제이다.
#include <stdio.h>
#include <stdlib.h>
void main() {
int n;
int* score;
printf("(성적입력) 전체 인원 수를 입력하세요. ");
scanf("%d", &n);
score = (int*)malloc(sizeof(int) * n); // malloc 사용 메모리 동적할당
//score = (int*)calloc(n, sizeof(int)); // calloc 사용 메모리 동적할당
if (score != NULL) {
printf("동적할당 성공\n");
printf("(동적할당된 공간의 값)\n");
for (int i = 0; i < n; i++) {
printf("%d번 : %d점\n", i + 1, score[i]);
}
printf("총 %d 명의 성적을 번호 순으로 입력하세요.\n", n);
for (int i = 0; i < n; i++) {
printf("%d번 성적 입력 : ", i + 1);
scanf("%d", &score[i]);
}
printf("(입력한 성적)\n");
for (int i = 0; i < n; i++) {
printf("%d번 : %d점\n", i + 1, score[i]);
}
free(score); // 메모리 해제
}
else {
printf("동적할당 실패\n");
}
}
[malloc 실행 결과]
(성적입력) 전체 인원 수를 입력하세요. 3
동적할당 성공
(동적할당된 공간의 값)
1번 : -842150451점
2번 : -842150451점
3번 : -842150451점
총 3 명의 성적을 번호 순으로 입력하세요.
1번 성적 입력 : 10
2번 성적 입력 : 20
3번 성적 입력 : 30
(입력한 성적)
1번 : 10점
2번 : 20점
3번 : 30점
[calloc 실행 결과]
(성적입력) 전체 인원 수를 입력하세요. 3
동적할당 성공
(동적할당된 공간의 값)
1번 : 0점
2번 : 0점
3번 : 0점
총 3 명의 성적을 번호 순으로 입력하세요.
1번 성적 입력 : 100
2번 성적 입력 : 90
3번 성적 입력 : 80
(입력한 성적)
1번 : 100점
2번 : 90점
3번 : 80점
위 실행 결과를 보면 malloc 함수는 할당된 메모리를 초기화하지 않아 이상한 값의 쓰레기가 들어있다.
반면 calloc 함수는 할당된 메모리를 0으로 모두 초기화하고 있다.
할당된 메모리를 더 이상 사용하지 않을 때는 free를 이용해 메모리 해제를 하여야 한다.
아래 코드는 이미 할당된 메모리의 크기를 변경하는 realloc 함수를 사용한 예제이다.
#include <stdio.h>
#include <stdlib.h>
void main() {
int n = 5; // 초기 학생 수
int* score;
if ((score = (int*)calloc(n, sizeof(int))) != NULL) {
printf("동적할당 성공\n");
}
else {
printf("동적할당 실패\n");
}
printf("현재 학생 수 : %d\n", n);
printf("(동적할당된 공간의 값)\n");
for (int i = 0; i < n; i++) {
printf("%d번 : %d점\n", i + 1, score[i]);
}
int m = n; // 기존 학생 수 백업
printf("(학생수 변경) 변경할 학생 수를 입력하세요.");
scanf("%d", &n);
// 변경은 큰 사이즈로만 가능 (작게는 재할당 하지 않음)
if ((score = (int*)realloc(score, sizeof(int) * n)) != NULL) {
printf("동적할당 공간 변경 성공\n");
// 기존의 사이즈 보다 작은 크기로 변경 시도할 경우 실제 크기 변화 없음
}
else {
printf("메모리 공간이 부족하여 추가할당 실패\n");
n = m; // 기존 학생 수로 복구
}
printf("(동적할당된 공간의 값)\n");
for (int i = 0; i < n; i++) {
printf("%d번 : %d점\n", i + 1, score[i]);
}
free(score); // 메모리 해제
}
[실행 결과]
동적할당 성공
현재 학생 수 : 5
(동적할당된 공간의 값)
1번 : 0점
2번 : 0점
3번 : 0점
4번 : 0점
5번 : 0점
(학생수 변경) 변경할 학생 수를 입력하세요.10
동적할당 공간 변경 성공
(동적할당된 공간의 값)
1번 : 0점
2번 : 0점
3번 : 0점
4번 : 0점
5번 : 0점
6번 : -842150451점
7번 : -842150451점
8번 : -842150451점
9번 : -842150451점
10번 : -842150451점
realloc 함수를 이용해 기존의 크기보다 더 크게 추가 할당받을 수 있다.
단, 연속적인 메모리공간이 필요한데 지정된 크기로 확장하기에 메모리가 충분치 않을 때는 기존 용량을 그대로 가지며 NULL을 반환한다..
'프로그래밍 > C' 카테고리의 다른 글
삽입 정렬 C언어 코드 (0) | 2023.02.16 |
---|---|
배열과 포인터 (0) | 2023.02.15 |
C언어 구조체 포인터 (0) | 2023.01.19 |
C언어 함수 포인터 (0) | 2023.01.19 |
C언어 포인터 배열과 배열 포인터 (0) | 2023.01.19 |