µ¿Àû ¸Þ¸ð¸®ÇÒ´ç
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
Docbook ¿ø¹®
  1. ¹®¼­°¡ ¿À·¡µÇ¾î¼­ Á» ¼öÁ¤ÇØ¾ß Çϴµ¥ À½..
  2. ¼Ö¶ó¸®½º¿¡¼­ÀÇ malloc()°ü·Ã¹®Á¦ Ãß°¡ - Á¤¸®Çؼ­ ¿ø¹®¿¡ ³ÖÀ» ¼ö ÀÖÀ½ yundream

    Contents

    1 ¼Ö¶ó¸®½º¿¡¼­ÀÇ ¸Þ¸ð¸® ÇÒ´ç


µ¿Àû ¸Þ¸ð¸®ÇÒ´ç

1절. ¼Ò°³

¾î¶² ¾ð¾î¸¦ ÀÌ¿ëÇØ¼­ ÇÁ·Î±×·¡¹ÖÀ» ÇϵçÁö ÇÁ·Î±×·¥ÀÌ ÇÏ´Â ÁÖ¿äÇÑ ÀÓ¹«´Â °á±¹ µ¥ÀÌŸ¸¦ ÁÖ°í/¹Þ°í À̸¦ °¡°øÇÏ´Â ÀÛ¾÷ÀÌ´Ù. ÀÌ´Â »ç¶÷ÀÌ »çȸ¿¡¼­ »ì¾Æ°¡±â À§ÇÑ °¡Àå ÁÖ¿äÇÑ ÀÏÀÌ ¼­·Î°£ÀÇ ´ëÈ­ÀΰͰú ¸¶Âù°¡ÁöÀÌ´Ù.

»ç¶÷Àº ¼­·Î ´ëÈ­¸¦ Çϱâ À§Çؼ­ ´ëÈ­ÇÒ ³»¿ëÀ» ¹Ì¸® ¾îµò°¡¿¡ ÀúÀåÇϰí ÀÖ¾î¾ß ÇÑ´Ù. »ç±³¸¦ À§ÇÑ ´ëÈ­¸¦ À§Çؼ­¶ó¸é ¸Ó¸®¿¡ ÀúÀåµÇ¾î ÀÖ´Â (ÀúÀåÀ̶ó°í ¸»ÇÏ´Ï Á» ÀÌ»óÇϱäÇÏ´Ù --;) µ¥ÀÌŸ(°æÇè)¸¦ Ȱ¿ëÇØ¼­ ´ëÈ­¸¦ ÇÏ¸é µÉ°ÍÀ̰í, ¾÷¹«»ó Áß¿äÇÑ ´ëÈ­¶ó¸é, ¹Ì¸® ³ëÆ®¸¦ ÇϵçÁö ÇØ¼­ ½ÇÁ¦ ´ëÈ­¶§ Áß¿äÇÑ ³»¿ëÀ» ºüÆ®¸®Áö ¾Êµµ·Ï Áغñ¸¦ ÇØ¾ß ÇÒ°ÍÀÌ´Ù.

ÇÁ·Î±×·¥µµ ¸¶Âù°¡Áö·Î ¾î¶² ¼öÇàÀ» À§Çؼ­´Â µ¥ÀÌŸ¸¦ ¾îµò°¡¿¡ ÀúÀåÇØ µÎ°í ÀÖ¾î¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ·¯ÇÑ µ¥ÀÌŸ ÀÇ ÀúÀåÀº ¸Þ¸ð¸®°ø°£ ȤÀº µð½ºÅ© °ø°£À» ÀÌ¿ëÇÑ´Ù.

À̹®¼­´Â µ¥ÀÌŸÀúÀåÀ» À§Çؼ­ ¾î¶»°Ô ¸Þ¸ð¸® °ø°£À» ÀÌ¿ëÇØ¾ß ÇÏ´ÂÁö¿¡ ´ëÇÑ ³»¿ëÀ» ´Ù·ç°í ÀÖ´Ù.


2절. ¸Þ¸ð¸® ÇÒ´ç

¸Þ¸ð¸® ÇÒ´çÀ» À§ÇÑ ¹æ¹ýÀº Å©°Ô 2°¡Áö°¡ ÀÖ´Ù. Á¤Àû¸Þ¸ð¸® ÇÒ´ç°ú µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀÌ ±×°ÍÀε¥, µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ» ¼³¸íÇϱâ Àü¿¡ Á¤Àû ¸Þ¸ð¸® ÇÒ´ç¿¡ ´ëÇØ °£´ÜÈ÷ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.


2.1절. Á¤Àû ¸Þ¸ð¸® ÇÒ´ç¿¡ ´ëÇØ¼­

Static Memory Allocation À̶ó°í ºÒ¸®¿ì¸ç, ¸Þ¸ð¸®ÀÇ Å©±â°¡ ¹Ì¸® °íÁ¤½ÃÄѼ­ ÇÒ´çÇÏ´Â °ÍÀ» ¸»ÇÑ´Ù. ÀϹÝÀûÀ¸·Î ¸Þ¸ð¸®Å©±â¸¦ ÇÒ´çÇÏ´Â ½¬¿î ¹æ¹ýÀ¸·Î, ÇÒ´ç½ÃÄÑÁà¾ßÇÒ ¸Þ¸ð¸®ÀÇ ÇѰè Å©±â¸¦ ¸íÈ®È÷ ¾Ë°í ÀÖÀ»°æ¿ì »ç¿ëÇÑ´Ù.

¿¹¸¦ µé¾î ÁÖ¼Ò¸¦ ÀúÀåÇϱâ À§ÇÑ ¸Þ¸ð¸® °ø°£ÀÌ ÇÊ¿äÇÏ´Ù°í ÇÒ¶§, ¿ì¸®´Â ÁÖ¼Ò¸¦ ÀúÀåÇϱâ À§Çؼ­ ¾î´ÀÁ¤µµÀÇ ¸Þ¸ð¸® °ø°£ÀÌ ÇÊ¿äÇÑÁö¸¦ ´ëÃæ °è»êÇÒ¼ö ÀÖ´Ù. ÁÖ¼Ò±æÀ̰¡ ¾Æ¹«¸® ±æ¾îºÁ¾ß 256 ÀÚ¸¦ ³ÑÁö ¾ÊÀ»°ÍÀ̱⠶§¹®ÀÌ´Ù.

ÀÌ·¯ÇÑ Á¤Àû ¸Þ¸ð¸® ÇÒ´çÀº ÇÁ·Î±×·¥ ½ÃÀ۽ÿ¡ ¹Ì¸® °íÁ¤½ÃÄѼ­ ÇÒ´ç½ÃÄÑ ¹ö¸°´Ù.(±×·± ÀÌÀ¯·Î Static À̶õ ´Ü¾î°¡ ºÙ´Â´Ù.)

...
int main()
{
    char address[256];
    char zipcode[10];

    ... 
    ...
}				
			
Á¤ÀûÀ¸·Î ¸Þ¸ð¸®¸¦ ÇÒ´çÇÒ°æ¿ì ¾à°£ÀÇ ¸Þ¸ð¸® ³¶ºñ°¡ ÀÖÀ»¼ö ÀÖ´Ù. º¸Åë ÇÒ´çÇÒ ¸Þ¸ð¸®¸¦ °áÁ¤ÇÒ¶§, ÃÖ´ë »ç¿ë°¡´ÉÇÏ´Ù°í »ý°¢µÇ´Â ¸Þ¸ð¸®·®º¸´Ù ¾à°£´õ Å©°Ô Àâ´Â°Ô º¸ÅëÀ̱⠶§¹®ÀÌ´Ù.

±×·¯³ª Å©±âÀÇ ÇѰ踦 ¸íÈ®È÷ ¾Ë¼ö ÀÖÀ»°æ¿ì, µ¿Àû ¸Þ¸ð¸® ÇҴ纸´Ù »ç¿ëÇϱ⠽±°í, ¹ö±×°¡ ¹ß»ýÇÒ È®·üµµ Àû´Ù´Â ÀåÁ¡À» °¡Áö°í ÀÖ´Ù. º¸Åë ÇÁ·ÎÁ§Æ®¸¦ ÁøÇàÇÏ°Ô µÉ°æ¿ì ¾à°£ÀÇ ¸Þ¸ð¸® ³¶ºñº¸´Ù´Â ¹ö±×ÀÇ ¹ß»ýÀ» ´õÅ« ÇÁ·Î±×·¥ À§Çè¿ä¼Ò·Î »ý°¢Çϱ⠶§¹®¿¡, °¡´ÉÇÑÇÑ Á¤Àû ¸Þ¸ð¸® ÇÒ´çÀ» »ç¿ëÇÑ´Ù. µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ» »ç¿ëÇÒ°æ¿ì ¸Þ¸ð¸® ´©¼ö, È¥µ¿µÇ´Â Æ÷ÀÎÅÍÀÇ »ç¿ë¿¡ ÀÇÇÑ À߸øµÈ ¸Þ¸ð¸® ÂüÁ¶µî ¿©·¯°¡Áö ¹®Á¦¸¦ ¹ß»ý½Ãų¼ö Àֱ⠶§¹®ÀÌ´Ù. Æ÷ÀÎÅÍ À߸ø»ç¿ëÇØ¼­ ¹ß»ýÇÏ´Â ¹®Á¦°¡ ¾ó¸¶³ª ÇÁ·Î±×·¡¸Ó¸¦ ±«·ÓÈ÷´ÂÁö´Â ¸»ÇÏÁö ¾Ê¾Æµµ Àß ¾Ë°í ÀÖÀ¸¸®¶ó »ý°¢µÈ´Ù.


2.2절. µ¿Àû ¸Þ¸ð¸® ÇÒ´ç¿¡ ´ëÇØ¼­

Dynamic Memory Allocation À̶ó°í ºÒ¸®¿ì¸ç, ¸»±×´ë·Î ÇÁ·Î±×·¥ ½ÇÇàÁß¿¡ µ¿ÀûÀ¸·Î ¸Þ¸ð¸®ÀÇ Å©±â¸¦ ÇÒ´ç½ÃÄÑÁà¾ß ÇÒ Çʿ䰡 ÀÖÀ»°æ¿ì »ç¿ëÇÑ´Ù.

¿¹¸¦ µé¾î¼­ °£´ÜÇÑ ¿¡µðÅÍ ÇÁ·Î±×·¥À» ¸¸µç´Ù°í ÇßÀ»¶§, º¸Åë ÆÄÀÏÀÇ ³»¿ëÀ» ¸Þ¸ð¸® »ó¿¡ ÀÐ¾î µéÀÌ°Ô µÉ°ÍÀÌ´Ù. ±×·±µ¥ ÆÄÀÏÀÇ Å©±â°¡ ¾ó¸¶°¡ µÉÁö´Â ¾Æ¹«µµ ¾Ë¼ö ¾ø´Ù. ÆÄÀÏÀÌ ÀÛÀ»°æ¿ì ±× Å©±â°¡ 0ÀÌ µÉ¼öµµ ÀÖ°ÚÁö¸¸ ÆÄÀÏÀÌ Å¬°æ¿ì ¼ö½Ê ¸Þ°¡ ¹ÙÀÌÆ® ȤÀº ±× ÀÌ»óÀÌ µÉ¼öµµ ÀÖÀ»°ÍÀ̱⠶§¹®ÀÌ´Ù. À̰æ¿ì¿¡´Â Á¤Àû ¸Þ¸ð¸® ÇÒ´çÀ» »ç¿ëÇÒ¼ö ¾øÀ¸¸ç, ¾î¿¼ö ¾øÀÌ µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ» »ç¿ëÇØ¾ß ÇÒ°ÍÀÌ´Ù.

"¾î¿¼ö ¾øÀÌ" ¶õ ¸»À» ºÙÀÎ ÀÌÀ¯´Â µÇµµ·ÏÀÌ¸é µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ» »ç¿ëÇÏ´Â°Í º¸´Ù´Â Á¤Àû¸Þ¸ð¸® ÇÒ´çÀ» »ç¿ëÇÏ´Â°Ô ¿©·¯¸ð·Î ÀÌÀÍÀÌ ¸¹±â ¶§¹®ÀÌ´Ù.


2.2.1절. malloc, realloc, sizeof, memset, free

2.2.1.1절. malloc

µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ» À§Çؼ­ C ´Â ÁÖ¿äÇÑ ¸î°¡Áö ½Ã½ºÅÛ ÇÔ¼ö¿Í Ű¿öµå¸¦ Á¦°øÇÑ´Ù. ÀÌÁß malloc ´Â ¸Þ¸ð¸® »ó¿¡¼­ ¿¬¼ÓµÈ ÀÏÁ¤ Å©±âÀÇ °ø°£À» ÇÒ´ç¹Þ±â À§Çؼ­ »ç¿ëÇÏ´Â °¡Àå ÀϹÝÀûÀÎ ÇÔ¼öÀÌ´Ù.

void *malloc(size_t number_of bytes);
					
malloc() ÇÔ¼ö´Â ÀÎÀÚ·Î ÇÒ´ç¹Þ°íÀÚ ÇÏ´Â ¸Þ¸ð¸®ÀÇ Å©±â¸¦ byte ´ÜÀ§·Î ¸í½ÃÇÑ´Ù. ¸¸¾à ¸Þ¸ð¸® ÇÒ´çÀÌ ¼º°øÇß´Ù¸é malloc ÇÔ¼ö´Â ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ ½ÃÀÛ À§Ä¡¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù. (Æ÷ÀÎÅÍ¿¡ ´ëÇÑ ³»¿ëÀº µ¥ÀÌŸ¿Í Æ÷ÀÎÅÍ) void * ¸¦ ¹Þ´Â ÀÌÀ¯´Â void * ¸¦ ÀÌ¿ëÇÒ°æ¿ì ¾î¶² ŸÀÔÀ¸·Î¶óµµ Çüº¯È¯ÀÌ °¡´ÉÇϱ⠶§¹®ÀÌ´Ù.

¸¸¾à 100 byte ÀÇ ¹®ÀÚ¸¦ ÀúÀåÇϱâ À§ÇÑ °ø°£À» ÇÒ´ç¹Þ±â ¿øÇÑ´Ù¸é ´ÙÀ½°ú °°ÀÌ malloc() ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÉ°ÍÀÌ´Ù.

char *cp;

cp = (char *)malloc(100);
					
À§ÀÇ ¹æ¹ýÀ» ÅëÇØ¼­ ¸Þ¸ð¸® ÇÒ´çÀ» ÇÏ°Ô µÈ´Ù¸é, ¸Þ¸ð¸®´Â ´ÙÀ½°ú °°ÀÌ ±¸¼ºµÇ°Ô µÉ°ÍÀÌ´Ù.
  0 1 2 3          0  ....        100
 +-+-+-+-+        +-+-+-+-+-+-+-+-+-+
 | cp    |        |                 |
 +-+-+-+-+        +-+-+-+-+-+-+-+-+-+
  |                |
  +----------------+ 
					
malloc() À» ÅëÇØ¼­ ¸Þ¸ð¸® ÇÒ´ç¿äûÀ» ¹ÞÀº ¿î¿µÃ¼Á¦(Ä¿³Î)Àº 100 byte Å©±â¸¸Å­ÀÇ ¿¬¼ÓµÈ ¸Þ¸ð¸®¸¦ ÇÒ´çÇϰí, ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ Ã¹¹øÂ°¸¦ °¡¸®Å°´Â ÁÖ¼Ò°ªÀ» ³Ñ°ÜÁØ´Ù. ¿ì¸®°¡ ½ÇÁ¦ *cp ¸¦°¡Áö°í ÇÏ´Â ¿©·¯°¡Áö µ¥ÀÌŸ °ü·ÃµÈ Á¶ÀÛÀº ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ ÁÖ¼Ò°ªÀ» ÀÌ¿ëÇØ¼­ ÀÌ·ç¾îÁö°Ô µÈ´Ù.

¾Æ·¡ÀÇ ¿¹Á¦¸¦ ½ÇÇà½ÃÄѺ¸¸é Á»´õ ½±°Ô ÀÌÇØ°¡ °¡´ÉÇÒ°ÍÀÌ´Ù.

¿¹Á¦ : malloc_1.c

#include <unistd.h>

int main()
{
    char buf[128] = "12345";
    char buf2[128] = "12345";
    char *ch;

    char *cp;
    char *ct;

    ch = buf;
    printf("address ch           : %x\n", &ch);
    printf("address ch -> buf    : %x\n", ch);
    printf("address buf          : %x\n", buf);
    printf("address buf -> first : %x\n", &(*buf));
    printf("\n");

    printf("address cp not      : %x\n", &cp);
    printf("address cp ->       : %x\n", cp);
    cp = (char *)malloc(100);
    cp = buf;
    printf("address cp -> buf   : %x\n", cp);
    cp = buf2;
    printf("address cp -> buf2  : %x\n", cp);
}
					
´ÙÀ½Àº À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ °á°úÀÌ´Ù. °á°ú °ªÀº ¶§¿Í Àå¼Ò¿Í ½Ã½ºÅÛ¿¡ µû¶ó ´Þ¶óÁú¼ö ÀÖ´Ù. (1, 2, 3, 4, ... ´Â ÇÊÀÚ°¡ ¼³¸íÀ» À§ÇØ ºÙÀÎ ¼ýÀÚÀÌ´Ù)
   
[root@localhost test]# ./malloc2
address ch           : bffff76c --- 1
address ch -> buf    : bffff7f0 --- 2
address buf          : bffff7f0 --- 3
address buf -> first : bffff7f0 --- 4

address cp not      : bffff768 --- 5
address cp ->       : 0        --- 6
address cp ->       : 8049860  --- 7
address cp -> buf   : bffff7f0 --- 8
address cp -> buf2  : bffff770 --- 9
					
1 ¹ø °á°ú´Â Æ÷ÀÎÅÍ *ch °¡ ÇÒ´çµÈ °÷ÀÇ ÁÖ¼Ò°ªÀÌ´Ù. 2 ¹ø °á°ú´Â *ch °¡ Æ÷ÀÎÅÍ(°¡¸®Å°´Â)ÇÏ´Â °÷ÀÇ Ã¹¹øÂ° ¸Þ¸ð¸® ÀÇ ÁÖ¼Ò°ªÀÌ´Ù. *ch °¡ °¡¸®Å°´Â °÷Àº buf °¡ ÀúÀåµÈ ¸Þ¸ð¸®ÀÇ Ã¹¹øÂ° ÁÖ¼Ò °ªÀ̹ǷΠbffff7f0 ÀÌ ¼¼ÆÃµÇ¾ú´Ù. 3¹ø, 4¹ø °á°ú ´Â *ch °¡ ½ÇÁ¦ bufÀÇ ÁÖ¼Ò¸¦ °¡¸®Å°°í ÀÖÀ½À» È®ÀÎÇϱâ À§ÇØ Ãâ·ÂÇÑ °ªÀÌ´Ù. ÀÌµé °á°ú¸¦ º¸¸é ½ÇÁ¦·Î Æ÷ÀÎÅͰ¡ ¾î¶»°Ô °ªÀ» °¡¸®Å°°í ÀÖ´ÂÁö È®ÀÎÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù.
  0 1 2 3       0 ....        100
 +-+-+-+-+     +-+-+-+-+-+-+-+-+-+
 | ch    |     | buf             |
 +-+-+-+-+     +-+-+-+-+-+-+-+-+-+
 bffff76c      bffff7f0
  |             |
  +-------------+
					

5 ¹øºÎÅÍ 8 ¹ø±îÁö´Â malloc()À» È£ÃâÇÔÀ¸·Î½á ¸Þ¸ð¸® ±¸¼ºÀÌ ½ÇÁ¦·Î ¾î¶»°Ô µÇ´ÂÁö¸¦ º¸¿©ÁØ´Ù. 5 ¹øÀº cp °¡ À§Ä¡ÇÑ °÷ÀÇ ÁÖ¼ÒÀÌ´Ï±î º°·Î ½Å°æ¾µÇÊ¿ä´Â ¾ø´Ù. 6 ¹øÀº malloc() ÇϱâÀü¿¡ *cp °¡ °¡¸®Å°°í ÀÖ´Â °÷ÀÇ ÁÖ¼Ò °ªÀ» º¸¿©Áִµ¥ ¸Þ¸ð¸® ÇÒ´çµÇ¾î ÀÖÁö¾ÊÀº°æ¿ìÀÌ´Ù. À§ÀÇ °æ¿ì NULL À» °¡¸®Å°°í Àִµ¥, À̰ÍÀº »óȲ¿¡ µû¶ó º¯ÇÑ´Ù. ´Ù½Ã ¸»Çؼ­ ¸Þ¸ð¸® ÇÒ´çÇÏÁö ¾Ê¾ÒÀ»°æ¿ì ÀÓÀÇÀÇ ¿µ¿ªÀ» °¡¸®Å²´Ù°í º¸¸é ¹«³­ÇÏ´Ù. 7 ¹øÀÌ malloc()À» ÀÌ¿ëÇØ¼­ ¸Þ¸ð¸® ÇÒ´çÇÑÈÄ °¡¸®Å°´Â °÷ÀÇ ÁÖ¼ÒÀε¥, malloc() ÇϱâÀü°ú ºñ±³ÇØ º¸¸é °¡¸®Å°°í ÀÖ´Â °÷ÀÇ ÁÖ¼Ò°¡ ¸íÈ®ÇÏ°Ô Á¤ÇØÁ® ÀÖÀ½À» È®ÀÎÇÒ¼ö ÀÖ´Ù. 8,9 ¹øÀº °¢°¢ buf ¿Í buf2 ¸¦ ´ëÀÔÇß´Ù.

 malloc ÇϱâÀü
  0 1 2 3 
 +-+-+-+-+
 | cp    |
 +-+-+-+-+     ?
  |            |
  +------------+
 
 malloc ÇÑÈÄ
  0 1 2 3           0 ...       100       0 ....        100
 +-+-+-+-+         +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+-+
 | cp    |         |               |     | buf             |
 +-+-+-+-+         +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+-+
                    8049860              bffff7f0
  |                 |
  +-----------------+

 buf¸¦ ´ëÀÔÇÑÈÄ 

  0 1 2 3           0 ...       100       0 ....        100         
 +-+-+-+-+         +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+-+        
 | ch    |         |               |     | buf             |        
 +-+-+-+-+         +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+-+        
 bffff7ec           8049860              bffff7f0                   
  |                                       |
  +---------------------------------------+
					


2.2.1.1.1절. ¸Þ¸ð¸®¸¦ »ç¿ëÇϱâ À§Çؼ­´Â ¹Ýµå½Ã ÇÒ´çÇØ¾ß ÇÑ´Ù.

´ç¿¬ÇÑ ¾ê±âÀÌÁö¸¸ ¸Þ¸ð¸®¸¦ »ç¿ëÇϱâ À§Çؼ­´Â Àû´çÇÑ °ø°£À» ÇÒ´çÇØÁÖ¾î¾ß ÇÑ´Ù. ¹Ù·Î À§ÀÇ ±×¸²¿¡¼­ malloc ÇϱâÀü¿¡ *cp °¡ °¡¸®Å°´Â ÁÖ¼Ò¸¦ º¸¸é »óȲ¿¡ µû¶ó ´Þ¶óÁø´Ù°í Çß´Ù. ±×·³À¸·Î ÇÒ´çµÇÁö ¾ÊÀº Æ÷ÀÎÅÍ¿¡ µ¥ÀÌŸ¸¦ ÀÔ·ÂÇϸé ÀÓÀÇÀÇ ÁÖ¼Ò¿¡ ¾î¶² °ªÀ» ÀÔ·ÂÇÏ´Â ²ÃÀÌ µÈ´Ù. ¿îÀÌ ÁÁÀ¸¸é ÀÓÀÇÀÇ ÁÖ¼Ò ¿µ¿ª¿¡ µ¥ÀÌŸ¸¦ ÃæºÐÈ÷ ÀúÀåÇÒ °ø°£ÀÌ È®º¸µÇ¾î À־ ¿¡·¯¾øÀÌ ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ¼öµµ ÀÖÁö¸¸, ´Ù¸¥ ÇÁ·Î¼¼½º°¡ Â÷ÁöÇϰí ÀÖ´Â ¸Þ¸ð¸® ¿µ¿ªÀ» ħ¹üÇÒ¼öµµ ÀÖ´Ù. ÀÌ·²°æ¿ì ¸Þ¸ð¸® ¿µ¿ª¿¡ ´ëÇÑ ¿ì¼±±ÇÀº ¸ÕÀú ȹµæÇÑ ÇÁ·Î¼¼½º¿¡°Ô ÀÖÀ½À¸·Î, Ä¿³ÎÀº ÀÌ ¸Þ¸ð¸®¿µ¿ª¿¡ µ¥ÀÌŸ¸¦ ¾²·Á°í ÇÏ´Â ÇÁ·Î¼¼½º¸¦ °­Á¦ Á¾·á½Ãų°ÍÀÌ´Ù(¼¼±×¸ÕÆ® ÆúÆ® ¿¡·¯)

À§¿¡¼­ ¸Þ¸ð¸® ÇÒ´çÀ» ÇÏÁö ¾Ê¾ÒÀ½¿¡µµ ºÒ±¸Çϰí ÇÁ·Î±×·¥ÀÌ Á¦´ë·Î ½ÇÇàµÇ¸é ¿îÀÌ ÁÁÀº°æ¿ì¶ó°í Çߴµ¥, »ç½Ç À̰æ¿ì´Â ¿îÀÌ ÁÁÀº°æ¿ì°¡ ¾Æ´Ï°í ¿îÀÌ ³ª»Û°æ¿ì°¡ µÈ´Ù. ¾ð¶æ º¸±â¿¡ Á¤»óÀûÀ¸·Î ½ÇÇàµÇ´Â°Í ó·³ º¸Àϼö Àֱ⠶§¹®¿¡ µð¹ö±ë ÀÛ¾÷À» ¾î·Æ°Ô ¸¸µé¼ö Àֱ⠶§¹®ÀÌ´Ù(´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ¸Þ¸ð¸® ¿µ¿ªÀ» ħ¹üÇÒ °¡´É¼ºÀ» °¡Áö°í ÀÖ´Â ºÒ¿ÏÀüÇÑ ÄÚµåÀÌ´Ù). Àß µ¹´Ù°¡ ¾î´À³¯ ¾ÆÄ§¿¡ È®ÀÎÇØº¸´Ï±î ÇÁ·Î±×·¥ÀÌ Á×°Ô µÉ È®·üÀÌ ³ô´Ù. »ç¿ëÇÏ´Â ¸Þ¸ð¸®ÀÇ °ø°£ÀÌ ÀÛÀ»¼ö·Ï(Å©¸éÀº ´Ù¸¥ ¿µ¿ªÀ» ħ¹üÇÒ °¡´É¼ºÀÌ Å©´Ù) ¿î ÁÁ°Ô(³ª»Ú°Ô) Á¦´ë·Î ÀÛµ¿µÉ È®·üÀÌ Å©´Ù.

±×·¯¹Ç·Î ¾Æ·¡¿Í °°Àº ÄÚµå´Â ½É°¢ÇÏ°Ô À߸øµÈ ÄÚµåÀÌ´Ù.(¾Æ¸¶ ¾î¶²°æ¿ì¿¡´Â Á¦´ë·Î ½ÇÇàµÇ°í, ¾î¶² °æ¿ì¿¡´Â ¼¼±×¸ÕÆ® ÆúÆ®°¡ ¶³¾îÁú°ÍÀÌ´Ù)

char *cp;

memcpy(cp, "1234", 100);
						
À§ÀÇ ÄÚµå´Â ¾Æ·¡¿Í °°ÀÌ ¹Ì¸® °ø°£À» ÇÒ´çÇÑÈÄ »ç¿ëÇϵµ·Ï Á¦ÀÛ¼º ÇØ¾ß ÇÑ´Ù.
char *cp;

cp = (char *)malloc(100);
memcpy(cp, "1234", 100);
						


2.2.1.2절. realloc

¸Þ¸ð¸®ÀÇ Å©±â¸¦ Á¶Á¤ÇϰíÀÚ ÇÒ¶§ »ç¿ëÇÑ´Ù. ¿¡µðÅÍ ÇÁ·Î±×·¥À» ¿¹·Î µé¾îº¸ÀÚ¸é, 2°¡Áö ¸Þ¸ð¸® ÇÒ´çÀ» ÇÒ¼ö ÀÖÀ»°Çµ¥, ÆÄÀÏÀÇ Å©±â¸¦ ÀÐÀº´ÙÀ½ ÆÄÀÏÀÇ Å©±â¸¸Å­ Çѹø¿¡ ¸Þ¸ð¸® ÇÒ´çÀ» ÇØ¹ö¸®´Â ¹æ¹ý°ú 1024 ¹ÙÀÌÆ® Á¤µµ·Î ÇÒ´çÇϰí, ÆÄÀÏÀ» ÀоîµéÀÌ´Ù°¡ 1024 ¸¦ ÃʰúÇÏ°Ô µÇ¸é, realloc ¸¦ ÀÌ¿ëÇØ¼­ 1024¸¦ ´õ ÇÒ´çÇØÁÖ´Â ¹æ¹ýÀÌ ÀÖ´Ù.

¾î´À°É »ç¿ëÇϵçÁö °ü°è´Â ¾øÁö¸¸, realloc Àº ±âº»ÇൿÀÌ ¸¸¾à ¿¬¼ÓµÈ ¸Þ¸ð¸® °ø°£ÀÌ ÃæºÐÇÏÁö ¾ÊÀ»°æ¿ì ¿¬¼ÓµÈ ¸Þ¸ð¸® °ø°£À» ÇÒ´çÇÒ¼ö ÀÖµµ·Ï »õ·Î °ø°£À» Àâ°Ô µÇ¸ç, ÀÌ¿ÍÁß¿¡ ±âÁ¸ÀÇ µ¥ÀÌŸ°¡ º¹»çµÇ¹Ç·Î »ó´çÈ÷ ¸¹Àº ºñ¿ëÀÌ ¼Ò¸ðµÉ¼ö ÀÖ´Ù.(½ÇÁ¦ Å×½ºÆ® ÇØº¸¸é ¾Ë°ÚÁö¸¸ malloc ¿¡ ºñÇØ¼­ ´«¿¡ ¶ç°Ô ¸¹Àº ½Ã°£ÀÌ ¼Ò¸ðµÈ´Ù)

¿¹Á¦ : realloc.c

#include <unistd.h>

int main()
{
    char *cp;
    int i;

    cp = (char *)malloc(100);
    memcpy(cp, "111", 100);
    printf("100     : %x\n", cp);
    cp = (char *)realloc(cp, 10000);
    printf("10000   : %x\n", cp);
    cp = (char *)realloc(cp, 1000000);
    printf("1000000 : %x\n", cp);
    printf("Value is (%s)\n", cp);
}
					
´ÙÀ½Àº À§ÀÇ ¿¹Á¦¸¦ ½ÇÇà½ÃŲ °á°úÀÌ´Ù.
[root@localhost doc]# ./realloc
100     : 8049770
10000   : 8049770
1000000 : 4015e008
Value is (111)
					
À§ÀÇ °ªÀº »óȲ¿¡ µû¶ó º¯ÇÒ¼ö ÀÖ´Ù. 100, 10000 Àº °°Àº ¸Þ¸ð¸® ÁÖ¼Ò¸¦ »ç¿ëÇϰí ÀÖÁö¸¸, 1000000 ÀÌ µÇ¸é¼­ ¸Þ¸ð¸®ÀÇ À§Ä¡°¡ º¯°æµÇ¾úÀ½À» ¾Ë¼ö ÀÖ´Ù. ¾Æ¹«·¡µµ 100 °ú 10000 ÀÇ °æ¿ì ±×¸® Å«Â÷À̰¡ ³ªÁö ¾Ê±â ¶§¹®¿¡ ÇöÀç À§Ä¡¿¡¼­ ¿¬¼ÓµÈ ¸Þ¸ð¸® °ø°£À» È®º¸ÇϱⰡ ¼ö¿ùÇÏÁö¸¸ °ªÀÌ Ä¿Áú¼ö·Ï ¿¬¼ÓµÈ ¸Þ¸ð¸® °ø°£À» È®º¸°¡ ¾î·Á¿öÁö±â ¶§¹®¿¡, ¾î¿¼ö ¾øÀÌ ¸Þ¸ð¸® À̵¿ÀÌ ÀϾ°Ô µÈ´Ù. ¸Þ¸ð¸® À§Ä¡ À̵¿ÀÌ ÀϾ´Ù ÇÏ´õ¶óµµ °ªÀº ±×´ë·Î º¹»çµÇ°í ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù.


2.2.1.3절. sizeof

sizeof ´Â C ¿¡¼­ Á¦°øÇϴ Ű¿öµå·Î ÇØ´ç ÀÚ·áÇüÀÇ Å©±â¸¦ µ¹·ÁÁØ´Ù. sizeof ´Â ¸Þ¸ð¸® ÇÒ´ç¿¡ À־ ²Ï Áß¿äÇÑ ¿ªÇÒÀ» °¡Áø´Ù. ÀÌÀ¯´Â °¢ ÀÚ·áÇü¸¶´Ù Â÷ÁöÇÏ´Â byte Å©±â°¡ Ʋ¸®°í, °°Àº ÀÚ·áÇüÀ̶ó ÇÒÁö¶óµµ ¿î¿µÃ¼Á¦¿¡ µû¶ó ±× Å©±â°¡ ´Þ¶óÁú¼ö Àֱ⠶§¹®ÀÌ´Ù. ¿¹¸¦µé¾î int Çü ÀÚ·á 4°³¸¦ ÀúÀåÇϱâ À§Çؼ­ ´ÙÀ½°ú °°ÀÌ ¸Þ¸ð¸® Å©±â¸¦ ÇÒ´çÇß´Ù°í ÇÏÀÚ.

int *ip;

ip = (int *)malloc(16);
					
int ÇüÀº º¸ÅëÀÇ °æ¿ì 4byte À̴ϱî 4°³ÀÇ ÀڷḦ ÀúÀåÇϱâ À§Çؼ­ ´Â 16 ¸¸Å­ÀÇ Å©±â°¡ ÇÊ¿äÇÑ°Ç È®½ÇÇÏ´Ù. ±×·¯³ª int ÇüÀÇ Å©±â°¡ 4byte ÀΰÍÀº º¸ÅëÀÇ °æ¿ìÀ̰í 2byte ȤÀº 8byte ÀÎ °æ¿ì°¡ ÀÖÀ»¼öµµ ÀÖ´Ù. ±×·²°æ¿ì À§ÀÇ ÇÁ·Î±×·¥Àº ÇöÀç ¿î¿µÃ¼Á¦¿¡¼­´Â ¹®Á¦ ¾ø°ÚÁö¸¸, ´Ù¸¥ ¿î¿µÃ¼Á¦·Î Æ÷ÆÃÇϰíÀÚ ÇÒ¶§ ¹®Á¦°¡ µÉ¼öµµ ÀÖ´Ù.

ÀÌ·± ¹®Á¦¸¦ ¾ø¾Ö±â À§Çؼ­ sizeof Ű¿öµå¸¦ Á¦°ø¹Þ¾Æ¼­ »ç¿ëÇÑ´Ù. ÀÌ Å°¿öµå¸¦ »ç¿ëÇÏ¸é ¿î¿µÃ¼Á¦¿¡¼­ »ç¿ëÇÏ´Â ÀÚ·áÇüÀÇ Å©±â¸¦ µ¹·ÁÁÖ°Ô µÊÀ¸·Î À§¿¡¼­¿Í °°Àº ¹®Á¦Á¡ÀÌ ¹ß»ýÇÏÁö ¾Ê´Â´Ù.

int *ip;

ip = (int *)malloc(sizeof(int)*4);

printf("int size is %d\n", sizeof(int));
					
int ÀÚ·áÇüÀ» À§Çؼ­ 4byte °ø°£À» ÇÊ¿ä·Î ÇÏ´Â ¿î¿µÃ¼Á¦¶ó¸é 16, 8byte ¸¸Å­À» ÇÊ¿ä·Î ÇÏ´Â ¿î¿µÃ¼Á¦¶ó¸é 32byte ¸¸Å­À» ÇÒ´ç¹ÞÀ»¼ö ÀÖ°Ô µÉ°ÍÀÌ´Ù.


2.2.1.4절. free

malloc() Àº ¸Þ¸ð¸® ÇÒ´çÀ» Ä¿³Î¿¡ ¿äûÇÏ´Â ½Ã½ºÅÛ ÇÔ¼öÀÌ´Ù. ±×·¯¹Ç·Î ÀÏ´Ü malloc()¿¡ ÀÇÇØ¼­ ÇÒ´ç¹ÞÀº ¸Þ¸ð¸®´Â ÇÁ·Î¼¼½º°¡ Á¾·áµÉ¶§±îÁö Ä¿³Î¿¡ ÀÇÇØ¼­ º¸È£¹Þ°Ô µÈ´Ù.

À̸»Àº malloc() ¸¦ À߸ø »ç¿ëÇÒ°æ¿ì ¾µµ¥¾ø´Â ¸Þ¸ð¸® °ø°£ÀÇ ³¶ºñ ¸¦ °¡Á® ¿Ã¼ö ÀÖÀ¸¸ç, ½É°¢ÇÒ°æ¿ì ¸Þ¸ð¸® ´©¼ö¸¦ °¡Á®¿Ã¼ö ÀÖ´Ù´Â ¶æÀ̵ȴÙ. ´ÙÀ½ÀÇ ¿¹¸¦ º¸ÀÚ

warn_mem.c

#include <unistd.h>

int main()
{

    char *cp;

    while(1)
    {
        cp = (char *)malloc(10000);
        printf("%x\n", cp);
        sleep(1);
    }
}
					
À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄѺ¸¸é, ¿î¿µÃ¼Á¦¿¡¼­ °è¼ÓÀûÀ¸·Î 10000byte Å©±âÀÇ »õ·Î¿î ¸Þ¸ð¸® °ø°£À» ÇÁ·Î¼¼½º¿¡°Ô ÇÒ´çÇØ Áִ°ÍÀ» º¼¼ö ÀÖ´Ù.
[root@localhost doc]# ./warn_mem
8049690
8061d38
807a3e0
8092a88
80ab130
80c37d8
					
½ÇÁ¦ warn_mem ÀÇ ½ÇÇà°á°ú ¸Þ¸ð¸® ´©¼ö°¡ »ý±â´ÂÁö È®ÀÎÀ» À§Çؼ­ °£´ÜÇÑ ½ºÅ©¸³Æ®¸¦ ¸¸µé¾î¼­ Å×½ºÆ®¸¦ ÇØº¸µµ·Ï ÇÏÀÚ.
[root@coco /root]# while [ 1 ]
> do 
> ps -aux | grep warn_mem | grep -v vi | grep -v grep
> sleep 1
> done
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root     11719  0.0  0.3  1436  400 ttypc    S    11:24   0:00 ./warn_mem
root     11719  0.0  0.3  1636  408 ttypc    S    11:24   0:00 ./warn_mem
root     11719  0.0  0.3  1736  412 ttypc    S    11:24   0:00 ./warn_mem
root     11719  0.0  0.3  1836  416 ttypc    S    11:24   0:00 ./warn_mem
root     11719  0.0  0.3  1936  420 ttypc    S    11:24   0:00 ./warn_mem
root     11719  0.0  0.3  2036  424 ttypc    S    11:24   0:00 ./warn_mem
root     11719  0.0  0.3  2236  432 ttypc    S    11:24   0:00 ./warn_mem
root     11719  0.0  0.3  2336  436 ttypc    S    11:24   0:00 ./warn_mem
					
ps ÀÇ Çì´õ ºÎºÐÀº ¿ø·¡ ½ºÅ©¸³Æ®ÀÇ ½ÇÇà°á°ú¿¡´Â Ç¥½ÃµÇÁö ¾ÊÁö¸¸ ps °á°úÀÇ ÇÊµå ±¸ºÐÀ» ½±°Ô Çϱâ À§Çؼ­ Ãß°¡ ½ÃÄ×´Ù. À§ÀÇ °á°ú¸¦ º¸¸é warn_mem ÇÁ·Î¼¼½º¿¡¼­ Á¡À¯ÇÏ´Â ¸Þ¸ð¸®ÀÇ Å©±â°¡ Áö¼ÓÀûÀ¸·Î Áõ°¡µÇ°í ÀÖÀ½À» º¼¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ¸Þ¸ð¸® ´©¼ö´Â ÇÁ·Î±×·¥°ú ½Ã½ºÅÛ¿¡ ¸Å¿ì Ä¡¸íÀûÀϼö ÀÖ´Ù. ƯÈ÷ ÀÌ·¯ÇÑ Á¾·ùÀÇ ¹®Á¦´Â ÄÄÆÄÀÏ·¯¿¡¼­ 󸮸¦ ÇØÁÖÁö ¾Ê±â ¶§¹®¿¡ ³ªÁß¿¡ ¹®Á¦Á¡À» ã±â°¡ ¸Å¿ì °ï¶õÇØÁø´Ù. ÈçÈ÷ ¸»ÇÏ´Â ¸îÀÏ Àßµ¹´Ù°¡ Á×´Â ÇÁ·Î±×·¥ÀÌ µÉ °¡´É¼ºÀÌ Å©´Ù.

±×·¯¹Ç·Î »ç¿ëÇÏÁö ¾Ê´Â ¸Þ¸ð¸®°ø°£Àº ¹Ýµå½Ã ¿î¿µÃ¼Á¦¿¡°Ô µÇµ¹·Á ÁÖ¾î¾ß ÇÑ´Ù. C ´Â µ¿ÀûÀ¸·Î ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ ÇØÁ¦¸¦ À§Çؼ­ free() ¸¦ Á¦°øÇÑ´Ù. ´ÙÀ½Àº warn_mem.c ÀÇ ¸Þ¸ð¸® ´©¼ö ¹®Á¦¸¦ free() ¸¦ ÅëÇØ¼­ ÇØ°áÇÑ ÄÚµåÀÌ´Ù.

free_mem.c

#include <unistd.h>

int main()
{

    char *cp;

    while(1)
    {
        cp = (char *)malloc(100000);
        printf("%x\n", cp);
        sleep(1);
        free(cp);
    }
}
					
À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇà½Ã۰í, Å×½ºÆ®¸¦ ÇØº¸¸é ±âÁ¸¿¡ ÀÖ´ø ¸Þ¸ð¸® ´©¼ö Çö»óÀÌ »ç¶óÁ³À½À» È®ÀÎÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù.


3절. µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀÇ ÀÀ¿ë

À̹øÀå¿¡¼­´Â µ¿Àû¸Þ¸ð¸® ÇÒ´çÀÇ ÀÀ¿ë ¿¹Á¦¸¦ ¸¸µé¾î º¼°ÍÀÌ´Ù. ¸¸µé ÀÀ¿ë ¿¹Á¦´Â linked list ÀÌ´Ù.


3.1절. ¸µÅ©µå ¸®½ºÆ® ¿¡ ´ëÇØ¼­

¸µÅ©µå ¸®½ºÆ®´Â ±×¸® °£´ÜÈ÷ ´Ù·ê¼ö ÀÖ´Â ÁÖÁ¦°¡ ¾Æ´Ï´Ù. ¸µÅ©µå ¸®½ºÆ®¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº ÀڷᱸÁ¶¸¦ ´Ù·ê ±âȸ°¡ ÀÖÀ¸¸é ±×¶§ Çϱâ·Î Çϰí, ¿©±â¿¡¼­´Â °³³äÁ¤µµ¸¸ ¼³¸íÇϵµ·Ï ÇϰڴÙ.

¸µÅ©µå ¸®½ºÆ®´Â ¸»±×´ë·Î ¸®½ºÆ®¸¦ ¸¸µé±â À§Çؼ­ »ç¿ëµÇ´Â ÀڷᱸÁ¶ÀÌ´Ù. ¸®½ºÆ®¸¦ ¸¸µé±â À§Çؼ­´Â ÀÚ·áÀÇ ¿¬¼ÓµÈ ¼ø¼­¸¦ ¸¸µé¾î Áà¾ß ÇÑ´Ù. ±×·²·Á¸é ´ÙÀ½ÀÚ·áÀÇ Á¤º¸°¡ ¹«¾ùÀÎÁö¸¦ ¾Ë¾Æ¾ß Çϴµ¥, ¸µÅ©µå ¸®½ºÆ®¶õ ´ÙÀ½ÀÚ·áÀÇ Á¤º¸°¡ ¹«¾ùÀÎÁö¸¦ ¾Ë°í ÀÖ´Â ±¸Á¶¸¦ ¸»ÇÑ´Ù. ¿©±â¼­ ´ÙÀ½ÀÚ·áÀÇ Á¤º¸¶õ ´ÙÀ½ ÀÚ·á°¡ À§Ä¡Çϰí ÀÖ´Â ÁÖ¼ÒÀÇ °ªÀÌ µÉ°ÍÀÌ´Ù.

 P: Pointer
 +--------++-+   +--------++-+   +--------++-+
 | Data 1 ||P|   | Data 2 ||P|   | Data 3 ||P|
 +--------++-+   +--------++-+   +--------++-+
            |     |         |     |         |
            +-----+         +-----+         +--- NULL 
			
´ëÃæ À§¿Í °°Àº ¹æ½ÄÀ¸·Î ¿¬°áµÈ´Ù. ¸®½ºÆ®¸¦ ÀÌ·ç°í ÀÖ´Â ¸®½ºÆ® ¸â¹öµéÀº ½ÇÁ¦ Data ¿Í ´õºÒ¾î ´ÙÀ½ µ¥ÀÌŸÀÇ ÁÖ¼ÒÁ¤º¸¸¦ °¡Áö°í ÀÖ´Â Pointer À» °¡Áö°í ÀÖÀ¸¸ç, ÇÁ·Î±×·¡¸Ó´Â ÀÌ Pointer Á¤º¸¸¦ ÀÌ¿ëÇØ¼­, µ¥ÀÌŸ¿¡ Á¢±ÙÇÒ¼ö ÀÖ°Ô µÈ´Ù. À§ÀÇ ±×¸²À» º¸¸é ¾Ë°ÚÁö¸¸ Data 3 ¿¡ Á¢±ÙÇϱâ À§Çؼ­´Â Data 1 ¹øºÎÅÍ ¼øÂ÷ÀûÀ¸·Î Á¢±ÙÇØ¾ß ÇÑ´Ù´Â °ÍÀ» ¾Ë¼ö ÀÖ´Ù.


3.2절. µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ» ÅëÇÑ ¸µÅ©µå ¸®½ºÆ®ÀÇ ±¸Çö

À§¿¡¼­ ¸»ÇßÁö¸¸ ÀڷᱸÁ¶ ÀÚüÀÇ ¼³¸íÀ» ¸ñÀûÀÌ ¾Æ´Ñ °ü°è·Î °¡Àå ´Ü¼øÇÑ ÇüÅÂÀÇ ¸µÅ©µå ¸®½ºÆ®¸¦ ±¸ÇöÇϵµ·Ï ÇϰڴÙ. ÀÌ ¸µÅ©µå ¸®½ºÆ®´Â ´ÙÀ½°ú °°Àº ±â´ÉÀ» °¡Áø´Ù.

µ¥ÀÌŸ »ðÀÔ

¸â¹ö µ¥ÀÌŸ¸¦ »ðÀÔÇÑ´Ù. ÃÖÃÊ µ¥ÀÌŸ°¡ »ðÀԵɶ§´Â ´ÙÀ½ µ¥ÀÌŸ°¡ ¾øÀ½À¸·Î ´ÙÀ½µ¥ÀÌŸ¸¦ °¡¸®Å°´Â Pointer Àº NULL ÀÌ µÉ°ÍÀÌ´Ù. ¸¸¾à µÎ¹øÂ° µ¥ÀÌŸ°¡ µé¾î¿Â´Ù¸é ù¹øÂ° µ¥ÀÌŸÀÇ Pointer Àº µÎ¹øÂ° µ¥ÀÌŸÀÇ À§Ä¡¸¦ °¡¸®Å°°Ô µÉ°ÍÀÌ´Ù. µÎ¹øÂ° µ¥ÀÌŸ´Â ´Ù½Ã NULL À» °¡¸®Å°°Ô µÉ°ÍÀÌ´Ù.

µ¥ÀÌŸ »èÁ¦

µ¥ÀÌŸ »èÁ¦¸¦ Á¦´ë·Î ±¸ÇöÇϰíÀÚ ÇÑ´Ù¸é, ã±âÈÄ »èÁ¦¸¦ ±¸ÇöÇØ¾ß ÇϰÚÀ¸³ª ¿©±â¿¡¼­´Â POP ½ºÅ¸ÀÏÀÇ »èÁ¦¸¦ ±¸ÇöÇϵµ·Ï ÇÑ´Ù.(°¡Àå ¸ÕÀú µé¾î¿Â µ¥ÀÌŸ°¡ °¡Àå ¸ÕÀú »èÁ¦µÇ´Â ¹æ½Ä)

µ¥ÀÌŸ Ãâ·Â

¿ª½Ã °£´ÜÇÏ°Ô Ã³À½ÀÇ ¸®½ºÆ® ¸â¹öºÎÅÍ ¼øÂ÷ÀûÀ¸·Î °Ë»öÇØ°¡¸é¼­ µ¥ÀÌŸ¸¦ Ãâ·ÂÇÏ´Â ¹æ½ÄÀ¸·Î ±¸ÇöÇÒ °ÍÀÌ´Ù.

À§ÀÇ 3°¡Áö ±¸ÇöÀº ¸µÅ©µå ¸®½ºÆ® »Ó¸¸ ¾Æ´Ï¶ó ´Ù¸¥ ÀڷᱸÁ¶¿¡¼­µµ °¡Àå ±âº»ÀÌ µÇ´Â°ÍµéÀ̸ç À§ÀÇ ±¸Çö¹æ½ÄÀÇ ¾à°£ ´Ù¸¥ ÀÀ¿ëÀ¸·Î ¸¸µé¾îÁø´Ù. Á»´õ ³­À̵µ ÀÖ´Â ±¸ÇöÀº °¢ÀÚ °øºÎ»ï¾Æ¼­ ÇØº¸±â ¹Ù¶õ´Ù.


3.3절. ¿¹Á¦

linked_list.c

#include <unistd.h>
#include <string.h>

typedef struct
{
    char name[12];
    struct list_item *next_link;
} list_item;

list_item * add_item(list_item *, char *);
list_item * remobe_item(list_item *);
void print_list(list_item *item);

int main()
{
    list_item *list;

    list = NULL;

    list = add_item(list, "yundream");
    list = add_item(list, "kknd2");
    list = add_item(list, "hohoho");
    list = add_item(list, "loveisall");
    print_list(list);

    printf("\n");
    list = remove_item(list);
    print_list(list);
}

list_item * add_item(list_item *item, char *name)
{
    list_item *lp = item;

    // ±âÁ¸¿¡ Item ÀÌ ÀÖÀ»°æ¿ì 
    // °¡Àå ÃÖ±ÙÀÇ ItemÀÇ next_link °¡ Ãß°¡ µÇ´Â Item ÀÇ 
    // ÁÖ¼Ò¸¦ °¡¸®Å°µµ·Ï Æ÷ÀÎÅ͸¦ Á¶Á¤ÇÑ´Ù.  
    if (item != NULL)
    {
        while(item->next_link != NULL)
            item = item->next_link;

        item->next_link = (struct list_item *)malloc(sizeof(list_item));
        item = item->next_link;
        strcpy(item->name, name);
        return lp;
    }
    // óÀ½ Item Ãß°¡½Ã¿¡´Â °¡¸®Å³ µ¥ÀÌŸ°¡ ¾øÀ½À¸·Î 
    // next_link ´Â NULL ÀÌ µÈ´Ù.  
    else
    {
        item = (struct list_item *)malloc(sizeof(list_item));
        item->next_link = NULL;
        strcpy(item->name, name);
        return item;
    }
}

list_item * remove_item(list_item *item)
{
    list_item *tmp;
    printf("Element remove is %s\n", item->name);
    // ù¹øÂ° ¸µÅ©°¡ °¡¸®Å°´Â ´ÙÀ½ µ¥ÀÌŸ  
    // Áï µÎ¹øÂ° µ¥ÀÌŸÀÇ Á¤º¸¸¦ tmp ¿¡ ´ëÀÔÇϰí 
    // ù¹øÂ° µ¥ÀÌŸ¸¦ free ½ÃÄÑÁÜÀ¸·Î 
    // ¸µÅ©µå ¸®½ºÆ®¿¡¼­ Á¦°Å½ÃŲ´Ù. 
    tmp = item->next_link;
    free(item);
    return tmp;
}

void print_list(list_item *item)
{
    if (item == NULL)
        printf("NONE LIST\n");

    // Item ÀÇ Ã³À½ºÎÅÍ ³¡±îÁö ¼øÂ÷ÀûÀ¸·Î 
    // °Ë»öÇϸ鼭 µ¥ÀÌŸ¸¦ Ãâ·Â½ÃŲ´Ù. 
    else
        while(item != NULL)
        {
            printf("%10s : %x %x\n",
                            item->name,
                            item,
                            item->next_link);
            item = item->next_link;
        }
}
			

´ÙÀ½Àº ÇÊÀÚÀÇ ÄÄÇ»ÅÍ¿¡¼­ ½ÇÇà½ÃŲ °á°ú´Ù. ¹øÈ£´Â ¼³¸íÀ» À§Çؼ­ ºÙÀΰÍÀÌ´Ù.

[root@localhost test]# ./linked_list 
  yundream : 80498a0 80498b8 --- 1
     kknd2 : 80498b8 80498d0 --- 2
    hohoho : 80498d0 80498e8 --- 3
 loveisall : 80498e8 0       --- 4

Element remove is yundream
     kknd2 : 80498b8 80498d0
    hohoho : 80498d0 80498e8
 loveisall : 80498e8 0
			
2°³ÀÇ ÁÖ¼Ò°ªÀÌ Ãâ·ÂµÇ´Âµ¥, ù¹øÂ° ÁÖ¼Ò°ªÀº ÀÚ½ÅÀÇ ÁÖ¼Ò°ªÀ̰í 2¹øÂ° ÁÖ¼Ò°ªÀº ´ÙÀ½ °¡¸®Å°´Â µ¥ÀÌŸÀÇ ÁÖ¼Ò°ªÀÌ´Ù. º¸¸é 1 -> 2 -> 3 -> 4 ÀÇ ½ÄÀ¸·Î µ¥ÀÌŸ¸¦ °¡¸®Å°°í ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù.


1 ¼Ö¶ó¸®½º¿¡¼­ÀÇ ¸Þ¸ð¸® ÇÒ´ç

  • indra(1ndr4@hanmail.net)

#include <stdio.h> 
#include <stdlib.h> 
 
#define MAX     (1024*1024)*1024 
#define ALERT(funct, funct2, line) { \ 
        printf("Executed %s function. (in %s function. %d line)\n", \ 
        funct, funct2, line); \ 
} 
 
int main() 
{ 
        char *buf; 
 
        sleep(5); 
        ALERT("malloc", __FUNCTION__, __LINE__); 
        buf = (char*)malloc(MAX); 
        sleep(5); 
        ALERT("free", __FUNCTION__, __LINE__); 
        free(buf); 
        sleep(5); 
        ALERT("exit", __FUNCTION__, __LINE__); 
        exit(0); 
} 
 

OS ȯ°æÀº SunOS 5.8 i86 À̸ç, »ç¾çÀº 320 RAM, intel Pentium 3 800, LG IBM ³ëÆ®ºÏ, ÄÄÆÄÀÏ·¯´Â GNU gcc ¹öÀü 2.95(20010315 release) ¹öÀüÀÌ´Ù.

bash-2.03# uname -a; gcc -v 
SunOS indra 5.8 Generic_108529-16 i86pc i386 i86pc 
Reading specs from /usr/local/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/specs 
gcc version 2.95.3 20010315 (release) 
bash-2.03# 
 

À§ÀÇ Äڵ带 ÄÄÆÄÀÏ ÇÏ¿© ¹é±×¶ó¿îµå·Î ½ÇÇàÇϸ鼭 vmstat ¸í·ÉÀ» ÀÌ¿ë,
¸Þ¸ð¸® ÇÒ´ç ºÎºÐ¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù.

bash-2.03# cc -o free free.c 
bash-2.03# ./free  
[1] 18777 
bash-2.03# vmstat 1 
 procs     memory            page            disk          faults      cpu 
 r b w   swap  free  re  mf pi po fr de sr cd -- -- --   in   sy   cs us sy id 
 0 0 0 1270732 247888 29 247 4  0  0  0  0  1  0  0  0  131 1368  306  5  3 92 
 0 0 0 1269968 239636 59 515 0  0  0  0  0  0  0  0  0  121 2540  553  8  7 85 
 0 0 0 1269968 239616 59 509 0  0  0  0  0  0  0  0  0  124 2485  543  8  6 86 
Executed malloc function. (in main function. 15 line) 
 0 0 0 1269968 239600 59 516 0  0  0  0  0  0  0  0  0  119 2487  539  9  5 86 
 0 0 0 221380 239580 59 508  0  0  0  0  0  0  0  0  0  123 2480  543  8  6 86 
 0 0 0 221380 239564 59 508  0  0  0  0  0  0  0  0  0  122 2476  540 10  4 86 
 0 0 0 221380 239552 59 508  0  0  0  0  0  0  0  0  0  120 2488  546  9  5 86 
 0 0 0 221380 239540 59 508  0  0  0  0  0  0  0  0  0  118 2472  534 10  4 86 
Executed free function. (in main function. 18 line) 
 0 0 0 221380 239528 59 508  0  0  0  0  0  0  0  0  0  123 2487  542  9  6 85 
 0 0 0 221380 239608 59 508  0  0  0  0  0  0  0  0  0  120 2484  540  8  6 86 
 0 0 0 221380 239596 59 508  0  0  0  0  0  0  0  0  0  118 2474  538  9  5 86 
 0 0 0 221380 239584 59 508  0  0  0  0  0  0  0  0  0  124 2495  548  8  6 86 
 0 0 0 221380 239568 59 508  0  0  0  0  0  0  0  0  0  121 2483  543  9  5 86 
Executed exit function. (in main function. 21 line) 
 0 0 0 221380 239556 59 508  0  0  0  0  0  0  0  0  0  122 2474  534  8  6 86 
 0 0 0 1270024 239624 59 508 0  0  0  0  0  0  0  0  0  122 2479  542 11  3 86 
 0 0 0 1270024 239612 59 508 0  0  0  0  0  0  0  0  0  118 2469  534  6  8 86 
 0 0 0 1270024 239600 59 508 0  0  0  0  0  0  0  0  0  118 2513  543  7  7 86 
^C 
[1]+  Done                    ./free 
bash-2.03# 
 

½ÇÁ¦ÀûÀ¸·Î free() ÇÔ¼ö·Î µ¿Àû¸Þ¸ð¸® ÇÒ´çÀ» ÇØÁ¦Çß´Ù°í ÇÏ´õ¶óµµ ¾îÇø®ÄÉÀÌ¼Ç ´ÜÀ§¿¡¼­´Â ÇØ´ç ¸Þ¸ð¸®¸¦ ±×´ë·Î °¡Áö°í Àִ°ÍÀ¸·Î ³ªÅ¸³µ´Ù.

°°Àº Äڵ带 °¡Áö°í RedHat linux ¹èÆ÷ÆÇ¿¡¼­ test ¸¦ ÇØº¸¾Ò´Ù. OS ȯ°æÀº RH 8.0, gcc ¹öÀüÀº 3.2(20020903 release) ¹öÀüÀÌ´Ù.

indra@ ~test> ./free  
[1] 25255 
indra@ ~test> while :; do ps -aux | grep "./free"; sleep 1 ; done 
indra    25255  0.0  0.0  1308  216 pts/5    S    13:07   0:00 ./free 
indra    25255  0.0  0.0  1308  216 pts/5    S    13:07   0:00 ./free 
indra    25255  0.0  0.0  1308  216 pts/5    S    13:07   0:00 ./free 
Executed malloc function. (in main function. 15 line) 
indra    25255  0.0  0.1 1049892 312 pts/5   S    13:07   0:00 ./free 
indra    25255  0.0  0.1 1049892 312 pts/5   S    13:07   0:00 ./free 
indra    25255  0.0  0.1 1049892 312 pts/5   S    13:07   0:00 ./free 
indra    25255  0.0  0.1 1049892 312 pts/5   S    13:07   0:00 ./free 
Executed free function. (in main function. 18 line) 
indra    25255  0.0  0.1  1312  308 pts/5    S    13:07   0:00 ./free 
indra    25255  0.0  0.1  1312  308 pts/5    S    13:07   0:00 ./free 
indra    25255  0.0  0.1  1312  308 pts/5    S    13:07   0:00 ./free 
indra    25255  0.0  0.1  1312  308 pts/5    S    13:07   0:00 ./free 
indra    25255  0.0  0.1  1312  308 pts/5    S    13:07   0:00 ./free 
Executed exit function. (in main function. 21 line) 
[1]+  Done                    ./free 
^C 
 
indra@ ~test> 
 

SunOS ¿¡¼­ÀÇ ¸Þ¸ð¸® °ü¸®°¡ user ÀÇ ´«À¸·Î º¸À̴°͸¸ ´Ù¸¥°ÍÀÎÁö ¾Æ´Ï¸é ½ÇÁ¦ free() ÈÄ ¸Þ¸ð¸® °ü¸®°¡ È¿À²¼ºÀ» À§ÇÑ Ãø¸éÀ¸·Î ´Ù¸¥ OS ¿Í °ü¸®Ã¼°è°¡ ´Ù¸¥Áö´Â ¾ÆÁ÷±îÁö ºÒ ºÐ¸í ÇÏ´Ù.

ÀÌ¿¡ ´ëÇÑ yundream ´ÔÀÇ ´äº¯:


http://www.joinc.co.kr/modules.php?op=modload&name=Forum&file=viewtopic&topic=28365&forum=1&2

¼Ö¶ó¸®½º ¿î¿µÃ¼Á¦¿¡¼­ Å×½ºÆ® ÇѰŠ¾Æ´Õ´Ï±î ?
¸®´ª½º»ó¿¡¼­´Â free ÇßÀ»°æ¿ì Á¦´ë·Î ÇØÁ¦°¡ µÇ´Âµ¥,
¼Ö¶ó¸®½º¿¡¼­´Â ÇØÁ¦°¡ ¾ÈµÇ´õ±º¿ä.
Á¤È®È÷ ¸»ÇÏ¸é ¾ÈµÇ´Â°Íó·³ º¸Àδٰí ÇØ¾ß Á¤È®ÇÑ Ç¥ÇöÀÏµí ½ÍÀºµ¥,

Àúµµ ¿¹Àü¿¡ ¼Ö¶ó¿¡¼­ ÀÛ¾÷ÇÏ´Ù°¡,
malloc ÈÄ free °¡ ¾ÈµÇ´Â ¹®Á¦·Î ²Ï °í¹ÎÀ» ÇÑÀûÀÌ ÀÖ¾ú½À´Ï´Ù.
¸î¸î ¹®¼­¸¦ ã¾ÆºÃ´õ´Ï, ¸Þ¸ð¸®°ü·ÃÀÛ¾÷ ¾ÈÁ¤¼ºÀ» È®º¸Çϱâ À§Çؼ­¶ó°í µÇ¾î ÀÖ´Â°Í °°±â´Â ÇÏ´øµ¥
È®½ÇÈ÷´Â Àß ¸ð¸£°Ú½À´Ï´Ù.

¾î¶µç Àú°Í¶§¹®¿¡ ¸Þ¸ð¸® ´©¼ö¿Í °°Àº ¹®Á¦°¡
¹ß»ýÇÏÁö ¾Ê½À´Ï´Ù.
¼Ö¶ó¿¡¼­ ¸Þ¸ð¸®°ü¸®¸¦ ¾î¶»°Ô ÇÏ´ÂÁöÁ» ¾Ë¾ÆºÁ¾ß °Ú³×¿ä.

Àú¹®Á¦·Î °¡²û Â¥Áõ³¯¶§°¡ Àִµ¥,
¾î¶² ÀÌÀ¯·Î ÀϽÃÀûÀ¸·Î ÇÑ 100¸Þ°¡ ÀÌ»ó ¸Þ¸ð¸®¸¦ Àâ¾Æ¼­ ¾²°ÔµÇ¾ú´Ù¸é free¸¦ ÇØµµ ps »ó¿¡¼­´Â
100¸Þ°¡¸¦ ±×´ë·Î Àâ°í Àִ°ɷΠº¸À̱⠶§¹®¿¡,
ÇÁ·Î±×·¡¸Ó ÀÔÀå¿¡¼­´Â ¹®Á¦°¡ µÇÁö ¾Ê°ÚÁö¸¸,
°¡²û °í°´¿¡°Ô ÇÁ·Î±×·¥À» Á¦°øÇÒ¶§ ¹®Á¦°¡ µÉ¼öµµ ÀÖÁÒ.
"¿Ö ÀÌ·¸°Ô ¸Þ¸ð¸®¸¦ ¸¹ÀÌ Àâ¾Æ¸Ô¾î¿ä? ¹®Á¦ Àִ°Š¾Æ´Ñ°¡¿ä?"
ÀÌ·± ¹®Á¦°¡ ¹ß»ýÇÒ¼ö ÀÖ½À´Ï´Ù.
¼³¸íÀ» ÇØµµ ½±°Ô ³³µæÀ» ÇÏÁö ¸øÇÏÁÒ.


¸¶Áö¸·À¸·Î realloc() À» ÅëÇÑ ¸Þ¸ð¸® Àç ÇÒ´çÀ» test ÇÏ¿© º¸¾Ò´Ù.
linux ¿¡¼­´Â realloc() À» »ç¿ë½Ã, ¸Þ¸ð¸® »çÀÌÁî°¡ Àç ¼³Á¤µÇ´Â ¾ç»óÀ»
º¸¿´Áö¸¸ SunOS ¿¡¼­´Â ¿ª½Ã óÀ½ malloc() À¸·Î ÇÒ´çµÈ ¸Þ¸ð¸® »çÀÌÁ
À¯ÁöÇϰí ÀÖ¾ú´Ù.

#include <stdio.h> 
#include <stdlib.h> 
 
#define MAX     (1024*1024)*1024 
#define ALERT(funct, funct2, line) { \ 
        printf("Executed %s function. (in %s function. %d line)\n", \ 
        funct, funct2, line); \ 
} 
 
int main() 
{ 
        char *buf; 
 
        sleep(5); 
        ALERT("malloc", __FUNCTION__, __LINE__); 
        buf = (char*)malloc(MAX); 
        sleep(5); 
        ALERT("realloc", __FUNCTION__, __LINE__); 
        buf = (char*)realloc(buf, 1024*1024); 
        sleep(5); 
        ALERT("free", __FUNCTION__, __LINE__); 
        free(buf); 
        sleep(5); 
        ALERT("exit", __FUNCTION__, __LINE__); 
        exit(0); 
} 
 

indra@ ~test> ./free  
[1] 25389 
indra@ ~test> while :; do ps -aux | grep "./free"; sleep 1 ; done 
indra    25389  0.0  0.0  1308  216 pts/5    S    13:29   0:00 ./free 
indra    25389  0.0  0.0  1308  216 pts/5    S    13:29   0:00 ./free 
indra    25389  0.0  0.0  1308  216 pts/5    S    13:29   0:00 ./free 
indra    25389  0.0  0.0  1308  216 pts/5    S    13:29   0:00 ./free 
Executed malloc function. (in main function. 15 line) 
indra    25389  0.0  0.1 1049892 312 pts/5   S    13:29   0:00 ./free 
indra    25389  0.0  0.1 1049892 312 pts/5   S    13:29   0:00 ./free 
indra    25389  0.0  0.1 1049892 312 pts/5   S    13:29   0:00 ./free 
indra    25389  0.0  0.1 1049892 312 pts/5   S    13:29   0:00 ./free 
Executed realloc function. (in main function. 18 line) 
indra    25389  0.0  0.1  2340  316 pts/5    S    13:29   0:00 ./free 
indra    25389  0.0  0.1  2340  316 pts/5    S    13:29   0:00 ./free 
indra    25389  0.0  0.1  2340  316 pts/5    S    13:29   0:00 ./free 
indra    25389  0.0  0.1  2340  316 pts/5    S    13:29   0:00 ./free 
indra    25389  0.0  0.1  2340  316 pts/5    S    13:29   0:00 ./free 
Executed free function. (in main function. 21 line) 
indra    25389  0.0  0.1  1312  312 pts/5    S    13:29   0:00 ./free 
indra    25389  0.0  0.1  1312  312 pts/5    S    13:29   0:00 ./free 
indra    25389  0.0  0.1  1312  312 pts/5    S    13:29   0:00 ./free 
indra    25389  0.0  0.1  1312  312 pts/5    S    13:29   0:00 ./free 
indra    25389  0.0  0.1  1312  312 pts/5    S    13:29   0:00 ./free 
Executed exit function. (in main function. 24 line) 
[1]+  Done                    ./free 
^C 
indra@ ~test> 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.