์ƒˆ์†Œ์‹

๐Ÿ‘ฉโ€๐Ÿ’ป C

C ์–ธ์–ด - ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น (dynamic memory allocation) | malloc , free , stdlib.h , memset

  • -

 

 

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ , ํ•ด์ œํ•˜๋Š” malloc๊ณผ freeํ•จ์ˆ˜๋Š” stdlib.h ํ—ค๋”ํŒŒ์ผ๋‚ด์— ์ •์˜๋˜์–ด ์žˆ๋‹ค.

malloc (Meomory Allocation) : ์‚ฌ์šฉํ•  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๋„๋ก ํ•ด์ค€๋‹ค. ์ด๋•Œ ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๋Š” byte๋‹จ์œ„์ด๋‹ค.

free : ํ• ๋‹นํ–ˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ•ด์ œํ•œ๋‹ค.

 

 

malloc ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ, ์›ํ•˜๋Š” ์‹œ์ ์— ์›ํ•˜๋Š” size๋งŒํผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ด๋ผ๊ณ  ํ•œ๋‹ค.(dynamic memory allocation)

#include <stdio.h> #include <stdlib.h> int main(){ int *pointer ; // ํฌ์ธํ„ฐ ์„ ์–ธ pointer = malloc(sizeof(int)); // int์˜ ์‚ฌ์ด์ฆˆ๋งŒํผ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น. (4byte) printf("%p", pointer); // ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ ์ถœ๋ ฅ. free(pointer); // ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํ•ด์ œ }

ํฌ์ธํ„ฐ = malloc(size); ํ˜•์‹์œผ๋กœ ํ• ๋‹นํ•˜๋ฉด ๋œ๋‹ค.

 

 

malloc์„ ์ด์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋ฉด , ํž™ ์˜์—ญ์— ๊ณต๊ฐ„์„ ์žก๋Š”๋‹ค. ํž™์— ์ €์žฅ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ๋ฐ˜๋“œ์‹œ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋ฅผ ํ•ด์ค˜์•ผํ•œ๋‹ค. (freeํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ)

์ผ๋ฐ˜๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด, ์Šคํƒ์— ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋ฉฐ, ๋”ฐ๋กœ ํ•ด์ œ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์•„๋„๋œ๋‹ค.

 

memset (memory set)ํ•จ์ˆ˜๋Š” ์›ํ•˜๋Š” ํฌ๊ธฐ๋งŒํผ , ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ํ•œ๋ฒˆ์— ์„ค์ •ํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

string.h ํ—ค๋”์— ์ •์˜๋˜์–ด์žˆ์œผ๋ฉฐ , memset(ํฌ์ธํ„ฐ, ๋„ฃ์„ ๊ฐ’ , size);  ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

#include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ int *pointer1 = malloc(10); // ํฌ์ธํ„ฐ๋ณ€์ˆ˜ pointer1 ์— 10 byteํ• ๋‹น memset(pointer1 , 0 , 10); // (pointer1๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณต๊ฐ„์„, 0์œผ๋กœ ์ฑ„์šด๋‹ค, 10byte๋งŒํผ) printf("%d", *pointer1); free(pointer1); return 0; } ์ถœ๋ ฅ >>>>>> 0

 

memset ํ•จ์ˆ˜๋˜ malloc ํ•จ์ˆ˜๋˜ ํ• ๋‹นํ• size์— ์ˆซ์ž๋ฅผ ๋„ฃ๊ธฐ๋ณด๋‹ค๋Š” sizeof(์ž๋ฃŒํ˜•)์˜ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

 

๋„ ํฌ์ธํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜์ง€ ์•Š์€ ํฌ์ธํ„ฐ๋ฅผ ๋งํ•œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ, ๊ฐ€๋ฆฌํ‚ค๋Š”๊ฒƒ๋„ ์•„๋ฌด๊ฒƒ๋„ ์—†๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋˜ ์—ญ์ฐธ์กฐ๋„ ํ•  ์ˆ˜์—†๋‹ค.

#include <stdio.h> int main(){ int *pointer1 = NULL; printf("%p\n", pointer1 ); return 0; } ์ถœ๋ ฅ >>>>>>> 00000000

์ด๋Ÿฌํ•œ ๋„ ํฌ์ธํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ธฐ์ „์—, ์ด๋ฏธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ’์„ ๊ฐ–๊ณ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

 

 

 

ํฌ์ธํ„ฐ์— malloc ํ•จ์ˆ˜๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋ฉด, ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

#include <stdio.h> #include <stdlib.h> // malloc, free ํ•จ์ˆ˜ ํฌํ•จ ํ—ค๋”ํŒŒ์ผ int main() { int *numPtr = malloc(sizeof(int) * 10); // int 10๊ฐœ ํฌ๊ธฐ๋งŒํผ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น numPtr[0] = 10; // ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’ ํ• ๋‹น printf("%d\n", numPtr[0]); // ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’ ์ถœ๋ ฅ free(numPtr); // ๋™์ ์œผ๋กœ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ return 0; }

 

int *numPtr = malloc(sizeof(int)*10);

int numArr[10] ;

์ฆ‰, ์œ„์˜ ํฌ์ธํ„ฐ์™€, ๋ฐฐ์—ด์€ ๊ฐ™์€ ์—ญํ• ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค.

1์ฐจ์› ๋ฐฐ์—ด ๋ฟ ์•„๋‹ˆ๋ผ, 2์ฐจ์›, 3์ฐจ์› ๋ฐฐ์—ด๋„ ์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2์ฐจ์› ๋ฐฐ์—ด์€ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ , ๋‹ค์‹œ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์•ผํ•œ๋‹ค.

 

  • ์„ธ๋กœ ๊ณต๊ฐ„ ๋ฉ”๋ชจ๋ฆฌํ• ๋‹น : ์ž๋ฃŒํ˜• **ํฌ์ธํ„ฐ์ด๋ฆ„ = malloc(sizeof(์ž๋ฃŒํ˜• *) * ์„ธ๋กœํฌ๊ธฐ);
  • ๊ฐ€๋กœ ๊ณต๊ฐ„ ๋ฉ”๋ชจ๋ฆฌํ• ๋‹น : (๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด) ํฌ์ธํ„ฐ[i] = malloc(sizeof(์ž๋ฃŒํ˜•) * ๊ฐ€๋กœํฌ๊ธฐ);

 

ํฌ์ธํ„ฐ๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ

 

 

 

 

 

 

 

 

 

 

 

 

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.