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;
}

 

 ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ž์„ธํžˆ ๊ด€์ฐฐํ•ด๋ณด๋ฉด ๋™์  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์€ ๋™์  ๋ฐฐ์—ด๋กœ ๊ฐ„์ฃผํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋ฐฐ์—ด๊ณผ ๋™์ผํ•œ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.