1ν•™λ…„ (2023)/C μ–Έμ–΄

[C] Study: 동적 λ©”λͺ¨λ¦¬ - (2) malloc()κ³Ό free()

waterproof 2023. 8. 19. 16:08

 

 

 


(2) malloc()κ³Ό free()

 

 

 λ™μ  λ©”λͺ¨λ¦¬ ν• λ‹Ή μ ˆμ°¨μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž.

 

 λ™μ  λ©”λͺ¨λ¦¬ 할당은 λ„μ„œκ΄€μ—μ„œ 책을 λΉŒλ¦¬λŠ” μ ˆμ°¨μ™€ λΉ„μŠ·ν•˜λ‹€. λ„μ„œκ΄€μ—μ„œλŠ” ν•„μš”ν•œ 책을 μ‹ μ²­ν•˜κ³  책이 μ€€λΉ„λ˜λ©΄ λ°›μ•„μ˜€λŠ” 단계가 ν•„μš”ν•˜λ‹€. μ±…μ˜ μ‚¬μš©μ΄ λλ‚˜λ©΄ 책을 λ‹€μ‹œ λ„μ„œκ΄€μœΌλ‘œ λ°˜λ‚©ν•˜λŠ” 단계가 ν•„μš”ν•˜λ‹€.

 

 λ™μ  λ©”λͺ¨λ¦¬ 할당도 λ§ˆμ°¬κ°€μ§€μ΄λ‹€.

 

 λ¨Όμ € μ–Όλ§ˆλ‚˜ 할당을 받을 것인지λ₯Ό κ²°μ •ν•˜κ³  라이브러리 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬  운영 μ²΄μ œμ—κ²Œ λ©”λͺ¨λ¦¬λ₯Ό μš”μ²­ν•˜λŠ” 단계가 ν•„μš”ν•˜λ‹€. λ§Œμ•½ μΆ©λΆ„ν•œ λ©”λͺ¨λ¦¬κ°€ μ‘΄μž¬ν•˜λ©΄ κ·Έ μš”μ²­μ€ 승인되고 λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλœλ‹€. ν”„λ‘œκ·Έλž¨μ€ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•œλ‹€. μ‚¬μš©μ΄ λλ‚˜λ©΄ λ©”λͺ¨λ¦¬λ₯Ό λ‹€μ‹œ μš΄μ˜μ²΄μ œμ—κ²Œ λ°˜λ‚©ν•˜λŠ” 단계가 ν•„μš”ν•˜λ‹€. λ§Œμ•½ λ©”λͺ¨λ¦¬λ₯Ό λ°˜λ‚©ν•˜μ§€ μ•ŠμœΌλ©΄ λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ΄ 동적 λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•  수 μ—†κ²Œ 될 것이닀. λ”°λΌμ„œ λ°˜λ“œμ‹œ 동적 λ©”λͺ¨λ¦¬λŠ” λͺ…μ‹œμ μœΌλ‘œ λ°˜λ‚©μ„ ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

 

 

β‘  동적 λ©”λͺ¨λ¦¬ ν• λ‹Ή

 λ™μ  λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜λŠ” κ°€μž₯ 기본적인 ν•¨μˆ˜μΈ malloc()은 헀더 파일 <stdlib.h>에 μ›ν˜•μ΄ μ •μ˜λ˜μ–΄ 있으며 λ°”μ΄νŠΈ λ‹¨μœ„λ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•œλ‹€.

 

 

 

 malloc() ν•¨μˆ˜λŠ” μš”μ²­λœ 크기만큼의 λ©”λͺ¨λ¦¬ 곡간을 μ°Ύμ•„μ„œ λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œλ₯Ό λ°˜ν™˜ν•œλ‹€. λ‹¨μœ„λŠ” λ°”μ΄νŠΈμ΄λ‹€.

 

 λ”°λΌμ„œ malloc(100)이라고 ν•˜λ©΄ 100λ°”μ΄νŠΈμ˜ 곡간을 μš”μ²­ν•˜λŠ” 것이닀.

 

 λ§Œμ•½ μš”μ²­ν•œ λ©”λͺ¨λ¦¬ 곡간을 ν• λ‹Ήν•  수 μ—†λŠ” κ²½μš°μ—λŠ” NULL 값을 λ°˜ν™˜ν•œλ‹€.

 

 μ—¬κΈ°μ„œ λ°˜ν™˜ν•˜λŠ” 것은 voidλ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터이닀. void 포인터λ₯Ό λ°˜ν™˜ν•˜λŠ” 것은 ν”„λ‘œκ·Έλž˜λ¨Έκ°€ λ©”λͺ¨λ¦¬ 곡간을 μ–΄λ–€ μžλ£Œν˜•μœΌλ‘œ μ‚¬μš©ν• μ§€ μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. void ν¬μΈν„°λŠ” λ‹€λ₯Έ μžλ£Œν˜•μ˜ ν¬μΈν„°λ‘œ 변경이 κ°€λŠ₯ν•˜λ‹€. λ”°λΌμ„œ ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” μžμ‹ μ΄ μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” μžλ£Œν˜•μ˜ ν¬μΈν„°λ‘œ ν˜•λ³€ν™˜ν•˜μ—¬ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

 

 

β‘‘ 동적 λ©”λͺ¨λ¦¬ μ‚¬μš©

 λ™μ  λ©”λͺ¨λ¦¬ 곡간은 이름이 μ—†λ‹€. 동적 λ©”λͺ¨λ¦¬ 곡간은 였직 포인터λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€. 

 

 λ°˜ν™˜λœ 포인터λ₯Ό ν†΅ν•˜μ—¬ λ©”λͺ¨λ¦¬ 블둝에 데이터λ₯Ό μ“°κ³  읽을 수 μžˆλ‹€.

 

 *pi = 'a'; λ¬Έμž₯을 μˆ˜ν–‰ν•˜λ©΄ λ™μ μœΌλ‘œ ν• λ‹Ήλœ 곡간에 문자 'a'κ°€ μ €μž₯λœλ‹€.

 

*p = 'a';

 

β‘’ 동적 λ©”λͺ¨λ¦¬ λ°˜λ‚©

 

 free()λŠ” λ™μ μœΌλ‘œ ν• λ‹Ήλ˜μ—ˆλ˜ λ©”λͺ¨λ¦¬ 블둝을 μ‹œμŠ€ν…œμ— λ°˜λ‚©ν•œλ‹€.

 

 λ‹€μŒκ³Ό 같은 ν•¨μˆ˜ μ›ν˜•μ„ 가지며 μ—¬κΈ°μ„œ ptr은 malloc()μ΄λ‚˜ calloc()을 μ΄μš©ν•˜μ—¬ 동적 ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터이닀,

 

 

 μ»΄ν“¨ν„° μ‹œμŠ€ν…œμ—μ„œ λ™μ μœΌλ‘œ ν• λ‹Ή κ°€λŠ₯ν•œ λ©”λͺ¨λ¦¬λŠ” μ œν•œλ˜μ–΄ μžˆλ‹€.

 

 λ”°λΌμ„œ 할당받은 λ©”λͺ¨λ¦¬μ˜ μ‚¬μš©μ΄ 끝났을 κ²½μš°μ—λŠ” λ°˜λ“œμ‹œ λ©”λͺ¨λ¦¬λ₯Ό λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ΄ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ°˜λ‚©ν•˜μ—¬μ•Ό ν•œλ‹€.

 

 free()λ₯Ό ν˜ΈμΆœν•  λ•ŒλŠ” ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터λ₯Ό 인수둜 ν•˜μ—¬ ν˜ΈμΆœν•˜μ—¬μ•Ό ν•œλ‹€.

 

 λ”°λΌμ„œ malloc()이 λ°˜ν™˜ν•œ ν¬μΈν„°λŠ” μ ˆλŒ€λ‘œ μžŠμ–΄λ²„λ¦¬λ©΄ μ•ˆ λœλ‹€.

 

 

 

예제 #1

 

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

int main(void) {
	char *pc;

	pc = (char *)malloc(1*sizeof(char));
	if (pc == NULL) {
		printf("λ©”λͺ¨λ¦¬ ν• λ‹Ή 였λ₯˜\n");
		exit(1);
	}
    
    *pc = 'a';
	printf("%c \n", *pc);
	free(pc);

	return 0;
}

 

 

 

예제 #2

 

 

 5개의 μ •μˆ˜λ₯Ό μ €μž₯ν•  수 μžˆλŠ” 동적 λ©”λͺ¨λ¦¬ 곡간을 ν• λ‹Ήλ°›κ³  여기에 1, 2, 3, 4, 5κΉŒμ§€μ˜ μ •μˆ˜λ₯Ό μ €μž₯ν•΄λ³΄μž.

 

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

main(void) {
	int *pi;

	pi = (int *)malloc(5 * sizeof(int));
	if (pi == NULL) {
		printf("λ©”λͺ¨λ¦¬ ν• λ‹Ή 였λ₯˜\n");
		exit(1);
	}
    
	*pi = 1; // pi[0] = 1;
	*(pi + 1) = 2; // pi[1] = 2;
	*(pi + 2) = 3; // pi[2] = 3;
	*(pi + 3) = 4; // pi[3] = 4;
	*(pi + 4) = 5; // pi[4] = 5;

	free(pi);
	return 0;
}

 

ν”„λ‘œκ·Έλž¨ μ„€λͺ…

μ—¬κΈ°μ„œ 포인터 piλŠ” 5개의 μ •μˆ˜ μ€‘μ—μ„œ 첫 번쨰 μ •μˆ˜λ§Œμ„ 가리킨닀. κ·Έλ ‡λ‹€λ©΄ λ‹€λ₯Έ μ •μˆ˜λ“€μ€ μ–΄λ–»κ²Œ μ ‘κ·Όν•˜μ—¬μ•Ό ν•˜λŠ”κ°€? 사싀 이것은 μ •μˆ˜ νƒ€μž…μ˜ 1차원 λ°°μ—΄μ΄λ‚˜ λ§ˆμ°¬κ°€μ§€μ΄λ‹€. λ”°λΌμ„œ 포인터 λ§μ…ˆμ„ μ΄μš©ν•˜μ—¬ μ ‘κ·Όν•  μˆ˜λ„ 있고 μ•„λ‹ˆλ©΄ λ°°μ—΄ ν‘œμ‹œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ ‘κ·Όν•˜μ—¬λ„ λ§ˆμ°¬κ°€μ§€μ΄λ‹€. 첫 번쨰 방법은 piλ₯Ό λ°°μ—΄μ˜ μ΄λ¦„μ²˜λŸΌ μƒκ°ν•˜μ—¬ pi[1]와 같은 λ°©λ²•μœΌλ‘œ μ ‘κ·Όν•˜λŠ” 것이닀. 두 번째 방법은 pi에 μ •μˆ˜λ₯Ό λ”ν•˜μ—¬ λ‹€μŒ 객체λ₯Ό 가리킬 수 μžˆλ‹€. μ–΄λ–€ λ°©λ²•μ΄λ˜μ§€ μ—°μ‚°μ˜ κ²°κ³ΌλŠ” λ™μΌν•˜λ‹€.

 

 λ™μ  λ©”λͺ¨λ¦¬μ— 1, 2, 3, 4, 5λ₯Ό μ €μž₯ν•˜λŠ” λ¬Έμž₯은 λ‹€μŒκ³Ό 같이 반볡 ꡬ문으둜 μž‘μ„±ν•  수 μžˆλ‹€.

 

int i;
for(i = 0; i < 5; i++) {
	pi[i] = i + 1;
}

 

 μœ„μ˜ μ½”λ“œλ₯Ό μžμ„Ένžˆ 관찰해보면 동적 λ©”λͺ¨λ¦¬ 곡간은 동적 λ°°μ—΄λ‘œ κ°„μ£Όν•  수 μžˆμŒμ„ μ•Œ 수 μžˆλ‹€. λ°°μ—΄κ³Ό λ™μΌν•œ 기호λ₯Ό μ‚¬μš©ν•˜μ—¬μ„œ μ‚¬μš©ν•  수 μžˆλŠ” 것이닀.