프로그래밍/C

C언어 동적할당 malloc, calloc, realloc, free

swedu 2023. 1. 20. 00:28
728x90
반응형

2023.1.19. 최초 작성

 

 

필요한 순간에 필요한 크기만큼 메모리를 할당받아 사용하고자 할 때는 동적할당이란 개념이 적용되어 메모리의 힙(heap) 영역에 공간을 할당받는다.

 

포인터를 활용해 동적할당 된 메모리공간의 주소를 기억하고 접근할 수 있고 동적할당을 위해 malloc, calloc, realloc, free 이렇게 4가지 함수를 사용하는데 stdlib.h 헤더 파일에 포함되어 있다.

 

아래 코드는 malloccalloc 함수를 이용하여 입력된 학생 수에 맞게 동적 할당한 예제이다.

#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을 반환한다..

 

 
728x90
반응형

 

728x90
반응형

'프로그래밍 > 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