์ƒˆ์†Œ์‹

๐Ÿ‘ฉ‍๐Ÿ’ป C

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

  • -

 

* malloc ํ•จ์ˆ˜, free ํ•จ์ˆ˜

 

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ , ํ•ด์ œํ•˜๋Š” 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); ํ˜•์‹์œผ๋กœ ํ• ๋‹นํ•˜๋ฉด ๋œ๋‹ค.

 

* ์Šคํƒ(stack)๊ณผ ํž™(heap)

 

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

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

 

* memset ํ•จ์ˆ˜

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(์ž๋ฃŒํ˜•)์˜ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

 

*๋„ ํฌ์ธํ„ฐ (null pointer)

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

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

#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์ฐจ์› ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ.

 

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

 

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

 

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

 

 

 

 

 

 

 

 

 

 

 

 

Contents

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

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