Programming Language/C

[C์–ธ์–ด] ๋™์  ํ• ๋‹น : malloc()

602zzang 2023. 9. 12. 13:10

๐Ÿ’พ C์˜ ๋ฉ”๋ชจ๋ฆฌ ๋™์  ํ• ๋‹น

  • ์ปดํŒŒ์ผ ํƒ€์ž„
    → Data ์˜์—ญ๊ณผ Stack ์˜์—ญ์— ํ• ๋‹น๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ ๊ฒฐ์ •
  • ๋Ÿฐ ํƒ€์ž„ (ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ์ค‘)
    → ํž™ ์˜์—ญ์˜ ํฌ๊ธฐ ๊ฒฐ์ •

๋Ÿฐ ํƒ€์ž„์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น ๋ฐ›๋Š” ๊ฒƒ์„ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋™์  ํ• ๋‹น์ด๋ผ๊ณ  ํ•œ๋‹ค.

๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ํ•„์š”ํ•œ ๋งŒํผ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

C์–ธ์–ด์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋™์  ํ• ๋‹น์„ ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด malloc() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“Œ malloc() ํ•จ์ˆ˜

Memory + Allocation ์˜ ๋‹จ์–ด๊ฐ€ ํ•ฉ์ณ์ง„ malloc()์€ C์–ธ์–ด์—์„œ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋™์  ํ• ๋‹น์„ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

malloc() ํ•จ์ˆ˜์˜ ์›ํ˜•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

#include <stdlib.h>
void *malloc(size_t size);

๋™์  ํ• ๋‹น์„ ํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— #include <stdlib.h> ํ—ค๋”๋ฅผ ์„ ์–ธํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

malloc() ํ•จ์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค.

๋”ฐ๋ผ์„œ size ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ํ• ๋‹นํ•˜๋ ค๋Š” ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

malloc()์€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์— ์„ฑ๊ณตํ•˜๋ฉด, ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด ํฌ์ธํ„ฐ๋Š” void ํฌ์ธํ„ฐ์ด๋ฏ€๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ํ˜•๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

๐Ÿ“Œ free() ํ•จ์ˆ˜

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•ด์ฃผ๋ฉด ๋ฐ˜๋“œ์‹œ free() ํ•จ์ˆ˜๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํ•ด์ œํ•ด์•ผ ํ•œ๋‹ค.

์ด๋Š” ํ•ด์ œ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์•˜์„ ์‹œ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(memory leak)๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

free([๋™์  ํ• ๋‹น์ด ๋œ ๋ณ€์ˆ˜ ์ด๋ฆ„])

 

๐Ÿงช malloc() ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

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

int main() {
int *arr;
int N = 0;

// ๋ฐฐ์—ด ํฌ๊ธฐ ์ž…๋ ฅ ๋ฐ›๊ธฐ
scanf("%d", %N);

// ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น
arr = (int *)malloc(N * sizeof(int));

if (arr == NULL) {
	printf("๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์‹คํŒจ!\\n");
}

// ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ’์„ ๋„ฃ์–ด ์‚ฌ์šฉ
for (int i = 0; i < N; i++) {
	arr[i] = i;
}

// ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ
free(arr);
}

์œ„๋Š” ๋ฐฐ์—ด ํฌ๊ธฐ๋ฅผ ์ž…๋ ฅ ๋ฐ›๊ณ , malloc() ์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์  ํ• ๋‹น ์‹œ์ผœ์ฃผ๋Š” ์ฝ”๋“œ์ด๋‹ค.

malloc() ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด์ž.

// ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น
arr = (int *)malloc(N * sizeof(int));
  1. N * sizeof(int) : intํ˜•(4 byte) ์ด๋ฏ€๋กœ ๋ฐฐ์—ด ํฌ๊ธฐ ๋งŒํผ ๊ณฑํ•œ๋‹ค.
  2. ๋ฐ˜ํ™˜๋œ ํฌ์ธํ„ฐ๋ฅผ intํ˜• ํฌ์ธํ„ฐ๋กœ ํ˜•๋ณ€ํ™˜ ํ•œ๋‹ค.
  3. arr ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ €์žฅํ•œ๋‹ค.
๐Ÿ’ก sizeof() ๋ฅผ ์ด์šฉํ•ด byte ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•ด ํ• ๋‹น์„ ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.