Memory Allocation
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

7. Memory Allocation next up previous contents
Next: 8. Characters and Strings Up: C Programming FAQs Previous: 6. Arrays and Pointers

Subsections



7. Memory Allocation

$Id: Site_2fFAQ_2fCfaqHTML_2fnode9_2ehtml,v 1.1 2007/01/09 02:46:17 root Exp root $

¸¹Àº »ç¶÷µéÀÌ C ¾ð¾î¿¡¼­ pointer°¡ °¡Àå ¹è¿ì±â Èûµé´Ù°í ¸»ÇÕ´Ï´Ù. ±×·¯³ª »ç½Ç ÀÌ ¸»Àº pointerº¸´Ù pointer°¡ °¡¸®Å°´Â ¸Þ¸ð¸®¸¦ °ü¸®ÇϱⰡ Èûµé´Ù´Â ¶æÀÔ´Ï´Ù. C ¾ð¾î´Â »ó´ëÀûÀ¸·Î Àú¼öÁØÀÇ ¾ð¾îÀ̱⠶§¹®¿¡, ÇÁ·Î±×·¡¸Ó°¡ ¸Þ¸ð¸®¸¦ Á÷Á¢ ÇÒ´çÇØ¾ß ÇÕ´Ï´Ù. Á¦´ë·Î ÇÒ´çµÇÁö ¾ÊÀº ¸Þ¸ð¸®¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¾²´Â °ÍÀº ½É°¢ÇÑ ¹ö±×¸¦ ¹ß»ýÇÏ´Â °¡Àå ÁÖµÈ ¿øÀÎÀÌ µË´Ï´Ù.

7.1 Basic Allocation Problems

¿©·¯ºÐÀÌ Á÷Á¢ mallocÀ» ºÎ¸£Áö ¾Ê´Â´ÙÇØµµ, ¿©·¯ºÐÀÌ ¾²·Á°í ÇÏ´Â ¸Þ¸ð¸®°¡ Á¦´ë·Î ÃʱâÈ­µÇ¾ú´ÂÁö °Ë»çÇØ¾ß ÇÕ´Ï´Ù.



Q 7.1
ÀÌ ÄÚµå´Â ¿Ö µ¿ÀÛÇÏÁö ¾ÊÀ»±î¿ä?
  char *answer;
  printf("Type something:\n");
  gets(answer);
  printf("You typed \"%s\"\n", answer);

Answer
gets()¿¡ Àü´ÞµÈ Æ÷ÀÎÅÍ º¯¼öÀÎ answer´Â ¹®ÀÚ¿­ÀÌ ÀúÀåµÉ ¾î¶² °ø°£À» °¡¸®Å°°í ÀÖ¾î¾ß ÇÕ´Ï´Ù. À§ÀÇ Äڵ忡¼­´Â answer°¡ ¾îµð¸¦ °¡¸®Å°´Â Áö ¾Ë ¼ö ¾ø½À´Ï´Ù. Áï, ÃʱâÈ­µÇÁö ¾Ê´Â º¯¼öÀ̱⠶§¹®¿¡ ´ÙÀ½ ÄÚµå¿Í °°ÀÌ À߸øµÈ ÄÚµåÀÔ´Ï´Ù:

  int i;
  printf("i = %d\n", i);

µû¶ó¼­ ÁÖ¾îÁø ÄÚµåÀÇ Ã¹ ÁÙ¿¡¼­ ¿ì¸®´Â answer°¡ ¾îµð¸¦ °¡¸®Å°´ÂÁö ¾Ë ¼ö ¾ø½À´Ï´Ù. Áï, ¹Ù·Î À§ÀÇ Äڵ忡¼­ i°¡ ¹«½¼ °ªÀ» °¡Áö´ÂÁö ¾Ë ¼ö ¾ø´Â °Í°ú °°Àº ÀÌÀ¯ÀÔ´Ï´Ù. (ÃʱâÈ­µÇÁö ¾ÊÀº Áö¿ª º¯¼ö7.1´Â ÀϹÝÀûÀ¸·Î ¾²·¹±â °ªÀ» °¡Áö°Ô µË´Ï´Ù. ÀÌ´Â ³Î Æ÷ÀÎÅͿʹ ´Ù¸¨´Ï´Ù. Áú¹® [*]1.30, [*]5.1À» Âü°íÇϱ⠹ٶø´Ï´Ù)

À§¿Í °°ÀÌ, °£´ÜÈ÷ Áú¹®ÇÏ°í ´äº¯¹Þ´Â ÇÁ·Î±×·¥¿¡¼­´Â Æ÷ÀÎÅÍ ´ë½Å Áö¿ª ¹è¿­À» ¾²´Â °ÍÀÌ ÈξÀ °£´ÜÇÕ´Ï´Ù:

  #include <stdio.h>
  #include <string.h>

  char answer[100], *p;
  printf("Type something:\n");
  fgets(answer, sizeof answer, stdin);
  if ((p = strchr(answer, '\n')) != NULL)
    *p = '\0';
  printf("You typed \"%s\"\n", answer);

ÀÌ ¿¹Á¦´Â gets() ´ë½Å fgets()¸¦ ½è½À´Ï´Ù. µû¶ó¼­ ¹è¿­ÀÇ ³¡ÀÌ µ¤¾î¾²¿©Áú ¿°·Á°¡ ¾ø½À´Ï´Ù. (Áú¹® [*]12.23À» Âü°íÇϱ⠹ٶø´Ï´Ù. ¾Æ½±°Ôµµ ÀÌ ¿¹¿¡¼­ ¾´ fgets()´Â gets()¿Í ´Þ¸® ¸¶Áö¸· \nÀ» Áö¿ìÁö ¸øÇÕ´Ï´Ù.) answer¿¡ malloc()À¸·Î ¸Þ¸ð¸®¸¦ ÇÒ´çÇϰí, ¹öÆÛ Å©±â¸¦ ´ÙÀ½°ú °°ÀÌ ÆÄ¶ó¸ÞÅÍ·Î ³Ñ±â´Â ¹æ¹ýµµ ÀÖ½À´Ï´Ù.

  #define ANSWERSIZE    100



Q 7.2
strcat()ÀÌ µ¿ÀÛÇÏÁö ¾Ê½À´Ï´Ù. ÄÚµå´Â ´ÙÀ½°ú °°À¸¸ç:
  char *s1 = "Hello, ";
  char *s2 = "world!";
  char *s3 = strcat(s1, s2);
ÀÌ»óÇÑ °á°ú°¡ ¹ß»ýÇÕ´Ï´Ù.

Answer
Áú¹® [*]7.1¿¡¼­ ¾ð±ÞÇÑ °Íó·³, ÁÖ ¿øÀÎÀº ¿¬°áÇÑ ¹®ÀÚ¿­À» ÀúÀåÇÒ¸¸ÇÑ °ø°£ÀÌ ¾ø´Ù´Â °ÍÀÔ´Ï´Ù. C ¾ð¾î´Â µ¿ÀûÀ¸·Î ¹®ÀÚ¿­À» ó¸®ÇØÁÖÁö ¾Ê½À´Ï´Ù. C ÄÄÆÄÀÏ·¯´Â ¼Ò½º¿¡¼­ ¿ä±¸ÇÑ ¸¸Å­¸¸ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÕ´Ï´Ù (¹®ÀÚ¿­ÀÇ °æ¿ì¿£ ¹®ÀÚ ¹è¿­°ú ¹®ÀÚ¿­ »ó¼ö¸¦ Æ÷ÇÔÇÕ´Ï´Ù). ÇÁ·Î±×·¡¸Ó´Â ¹®ÀÚ¿­ ¿¬°á(concatenation)°ú °°Àº ½ÇÇà ½Ã°£ ¿¬»ê(run-time operation)¿¡ ÇÊ¿äÇÑ ÀûÀýÇÑ °ø°£À» ¹è¿­À̳ª malloc()À» ºÒ·¯¼­ Á÷Á¢ ¸¸µé¾î ÁÖ¾î¾ß ÇÕ´Ï´Ù.

strcat()Àº ¾î¶°ÇÑ °ø°£µµ ÇÒ´çÇØÁÖÁö ¾Ê½À´Ï´Ù; µÎ¹øÂ° ¹®ÀÚ¿­Àº ´Ü¼øÈ÷ ù¹øÂ° ¹®ÀÚ¿­¿¡ ºÙ¾î¼­ ¿¬°áµË´Ï´Ù. ±×·¯¹Ç·Î ù¹øÂ° ¹®ÀÚ¿­À» ÀúÀåÇÏ´Â °÷ÀÌ ÃæºÐÇÑ °ø°£À» °¡Áö°í ÀÖ¾î¾ß Çϸç, ¾µ ¼ö ÀÖ¾î¾ß(writable) ÇÕ´Ï´Ù. µû¶ó¼­ ´ÙÀ½°ú °°ÀÌ ¹è¿­·Î ¼±¾ðÇÏ¸é ½±½À´Ï´Ù:

  char s1[20] = "Hello, ";

¹°·Ð, ½ÇÀü¿¡ ¾²±â À§Çؼ­´Â À§¿Í °°ÀÌ 20À̶ó´Â »ó¼ö¸¦ ¾²´Â °ÍÀº ÁÁÁö ¾Ê½À´Ï´Ù. ¿ì¸®´Â ÀûÀýÇÑ °ø°£À» º¸ÀåÇÒ ¼ö ÀÖ´Â ¾î¶°ÇÑ ¸ÞÄ¿´ÏÁòÀ» ½á¼­ °ø°£À» ÇÒ´çÇØ¾ß ÇÕ´Ï´Ù.

strcat()ÀÌ Ã¹¹øÂ° ¹®ÀÚ¿­À» °¡¸®Å°´Â (Áú¹®¿¡¼­´Â s1) Æ÷ÀÎÅ͸¦ ¸®ÅÏÇϹǷÎ, º¯¼ö s3´Â ºÒÇÊ¿äÇÕ´Ï´Ù; strcat()À» ºÎ¸¥ ´ÙÀ½¿¡ °á°ú´Â s1ÀÌ °¡¸®Å°°í ÀÖ½À´Ï´Ù.

Áú¹®¿¡¼­ strcat()À» ºÎ¸¥ ÄÚµå´Â Å©°Ô µÎ°¡Áö ¹®Á¦¸¦ °¡Áö°í ÀÖ½À´Ï´Ù: ¸ÕÀú s1ÀÌ ÃæºÐÇÑ °ø°£À» °¡Áö°í ÀÖÁö ¾Ê´Ù´Â °Í°ú, ÀÌ ¹®ÀÚ¿­ÀÌ ¾µ ¼ö ¾ø´Â(read-only) ¹®ÀÚ¿­À̶ó´Â °ÍÀÔ´Ï´Ù. Áú¹® [*]1.32¸¦ Âü°íÇϱ⠹ٶø´Ï´Ù.

References
[CT&P] § 3.2 p. 32



Q 7.3
±×·¯³ª ¸Å´º¾ó(man) ÆäÀÌÁö´Â strcat()ÀÌ ÀÎÀÚ·Î µÎ °³ÀÇ char *¸¦ ¹Þ´Â´Ù°í ¾º¿© ÀÖ½À´Ï´Ù. ¾î¶»°Ô ÀÌ °Í¸¸ °¡Áö°í ÇÊ¿äÇÑ ¸Þ¸ð¸® °ø°£À» ¸¸µé¾î ÁÖ¾î¾ß ÇÑ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖÁÒ?

Answer
ÀϹÝÀûÀ¸·Î Æ÷ÀÎÅ͸¦ »ç¿ëÇÒ ¶§¿¡´Â Ç×»ó ¸Þ¸ð¸® °ø°£À» Àâ¾Æ ÁÖ¾î¾ß ÇÑ´Ù°í »ý°¢ÇØ¾ß ÇÕ´Ï´Ù. ¸¸¾à ¶óÀ̺귯¸® ÇÔ¼öÀÇ ¼³¸í¿¡ ¸Þ¸ð¸® ÇÒ´ç¿¡ ´ëÇÑ ¾ð±ÞÀÌ ¾ø´Ù¸é, ´ëºÎºÐÀº È£ÃâÇÏ´Â ÂÊ¿¡¼­ ¾Ë¾Æ¼­ ÇØ ÁÖ¾î¾ß ÇÕ´Ï´Ù.

UNIX ½ºÅ¸ÀÏÀÇ ¸Å´º¾ó(man) ÆäÀÌÁöÀÇ Ã¹ ºÎºÐ¿¡ ÀÖ´Â `Synopsis' ¼½¼Ç, ¶Ç´Â ANSI C Ç¥ÁØ¿¡ ³ª¿Â ÀÌ·¯ÇÑ ºÎºÐÀº À߸ø ÀÌÇØÇϱ⠽±½À´Ï´Ù. ÀÌµé ¹®¼­¿¡ ³ª¿Â ÄÚµå´Â È£ÃâÇÏ´Â ÀÔÀåÀÌ ¾Æ´Ñ ÇÔ¼ö¸¦ ¸¸µå´Â ÀÔÀå¿¡ ´õ °¡±õ±â ¶§¹®ÀÔ´Ï´Ù. ƯÈ÷ Æ÷ÀÎÅ͸¦ ÀÎÀÚ·Î ¹Þ´Â (±¸Á¶Ã¼³ª ¹®ÀÚ¿­) ´ëºÎºÐÀÇ ÇÔ¼öµéÀº Æ÷ÀÎÅͰ¡, ¾î¶² ¿ÀºêÁ§Æ®¸¦ (±¸Á¶Ã¼³ª ¹è¿­ -- Áú¹® [*]6.3, [*]6.4 Âü°í) °¡¸®ÄÑ¾ß ÇÏ´Â °æ¿ì°¡ ¸¹À¸¸ç, ÀÌ ¿ÀºêÁ§Æ®´Â ºÎ¸£´Â ÀÔÀå¿¡¼­ ÇÒ´çÇØ ÁÖ¾î¾ß ÇÏ´Â °æ¿ì°¡ ´ëºÎºÐÀÔ´Ï´Ù. ´Ù¸¥ ¿¹·Î´Â time() ÇÔ¼ö¿Í (Áú¹® [*]13.12 Âü°í) stat() ÇÔ¼ö¸¦ µé ¼ö ÀÖ½À´Ï´Ù.



Q 7.3b
´ÙÀ½°ú °°Àº Äڵ带 ½ÇÇàÇߴµ¥:
  char *p;
  strcpy(p, "abc");
µ¿ÀÛÀ» ÇÕ´Ï´Ù. ¿Ö ±×·¯ÁÒ? Á¦ ¿¹»ó´ë·Î¶ó¸é ÇÁ·Î±×·¥ÀÌ ¸Á°¡Á®¾ß(crash) Çϴµ¥¿ä.

Answer
ÃßÃøÄÁ´ë ¾ÆÁÖ Àç¼ö°¡ ÁÁÀº ¸ð¾çÀÔ´Ï´Ù. ÃʱâÈ­µÇÁö ¾ÊÀº Æ÷ÀÎÅÍ p¿¡ ¾î¶² ¾²·¹±â °ªÀÌ µé¾î°¬°í, ±× °ªÀÌ ¿©·¯ºÐÀÌ ¾µ ¼ö ÀÖ´Â ¸Þ¸ð¸® °ø°£À» °¡¸®Å°°í ÀÖ¾ú°í, ±× °ø°£ÀÌ ¾î¶² Áß¿äÇÑ ¸ñÀûÀ¸·Î ¾²À̰í ÀÖÁö ¾Ê¾Ò±â ¶§¹®ÀÔ´Ï´Ù.



Q 7.3c
Æ÷ÀÎÅÍ º¯¼ö´Â ¾ó¸¶³ª Å« ¸Þ¸ð¸®¸¦ ÇÒ´çÇÒ±î¿ä?
Answer
¾ÆÁÖ À߸øµÈ Áú¹®ÀÔ´Ï´Ù. Æ÷ÀÎÅÍ º¯¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼±¾ðÇß´Ù°í ÇÒ ¶§:
  char *p;
¿©·¯ºÐÀº (Á»´õ Á¤È®È÷ ¸»Çؼ­, ÄÄÆÄÀÏ·¯´Â) Æ÷ÀÎÅÍ ÀÚü¸¸ ÀúÀåÇÒ ¼ö ÀÖ´Â °ø°£À» ÇÒ´çÇÑ °ÍÀÔ´Ï´Ù; Áï, ÀÌ °æ¿ì sizeof(char *) ¹ÙÀÌÆ®¸¸Å­ÀÇ ¸Þ¸ð¸®°¡ ÇÒ´çµÈ °ÍÀÔ´Ï´Ù. ±×·¯³ª ÀÌ Æ÷ÀÎÅÍ´Â ¾ÆÁ÷ ¾î¶°ÇÑ ¸Þ¸ð¸®µµ °¡¸®Å°°í ÀÖÁö ¾Ê½À´Ï´Ù. Áú¹® [*]7.1°ú [*]7.2¸¦ Âü°íÇϱ⠹ٶø´Ï´Ù.



Q 7.4
´ÙÀ½°ú °°ÀÌ ÆÄÀÏ¿¡¼­ ÁÙ ´ÜÀ§·Î Àд Äڵ带 ¸¸µé¾ú½À´Ï´Ù:
  char linebuf[80];
  char *lines[100];
  int i;

  for (i = 0; i < 100; i++) {
    char *p = fgets(linebuf, 80, fp);
    if (p == NULL) break;
    lines[i] = p;
  }
±×·±µ¥ ÀÌ Äڵ带 ½ÇÇàÇϸé, ¸ðµç ÁÙ¿¡ ¸¶Áö¸· ÁÙÀÇ ³»¿ëÀÌ µé¾î°¡ ÀÖ½À´Ï´Ù.

Answer
¿©·¯ºÐÀÌ ¼±¾ðÇÑ linebuf´Â ´ÜÁö ÇÑ ÁÙ¸¸À» ÀúÀåÇÒ ¼ö ÀÖ´Â ¹öÆÛÀÔ´Ï´Ù. fgets¸¦ ºÎ¸¦ ¶§¸¶´Ù, ±âÁ¸ÀÇ ÁÙÀº µ¤¾î½áÁ® ¹ö¸³´Ï´Ù. fgets´Â ³»ºÎÀûÀ¸·Î ¸Þ¸ð¸®¸¦ ÇÒ´çÇØ ÁÖÁö ¾Ê½À´Ï´Ù. ¿¡·¯°¡ ³µ°Å³ª EOF¸¦ ¸¸³ªÁö ¾Ê´Â´Ù¸é, fgets°¡ ¸®ÅÏÇÏ´Â °ªÀº ¿©·¯ºÐÀÌ Ã¹¹øÂ° ÀÎÀÚ·Î ÀüÇØ ÁØ Æ÷ÀÎÅÍ¿Í °°½À´Ï´Ù. (ÀÌ °æ¿ì linebuf¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ)

ÀÌ·± ½ÄÀ¸·Î Äڵ带 ÀÛ¼ºÇÏ·Á ÇÑ´Ù¸é, ¿©·¯ºÐÀÌ °¢°¢ÀÇ ÁÙÀ» ÀúÀåÇÒ °ø°£À» ÀÏÀÏÀÌ ÇÒ´çÇØ ÁÖ¾î¾ß ÇÕ´Ï´Ù. Áú¹® [*]20.2ÀÇ Äڵ带 Âü°íÇϱ⠹ٶø´Ï´Ù.

References
[K&R1] § 7.8 p. 155
[K&R2] § 7.7 pp. 164-5 [ANSI] § 4.9.7.2
[C89] § 7.9.7.2
[H&S] § 15.7 p. 356



Q 7.5a
¹®ÀÚ¿­À» ¸®ÅÏÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé¾ú´Âµ¥, ¸®ÅÏÇÑ ¹®ÀÚ¿­ÀÌ ¾²·¹±â·Î ä¿öÁø °Í °°½À´Ï´Ù. ¿Ö ±×·²±î¿ä?
Answer
Æ÷ÀÎÅͰ¡ ÀûÀýÇÑ ¸Þ¸ð¸® °ø°£À» °¡¸®Å°°í ÀÖ´ÂÁö Àß °Ë»çÇØº¸½Ã±â ¹Ù¶ø´Ï´Ù. ÇÔ¼ö°¡ ¸®ÅÏÇÏ´Â Æ÷ÀÎÅÍ´Â Á¤ÀûÀ¸·Î ÇÒ´çµÈ ¹öÆÛÀ̰ųª, ÀÌ ÇÔ¼ö¸¦ ºÎ¸¥ À§ÂÊ¿¡¼­ Àü´ÞÇØ ÁØ ¹öÆÛÀ̰ųª, ¶Ç´Â mallocÀ¸·Î ÇÒ´çÇÑ ¹öÆÛ µîÀ» °¡¸®Å°°í ÀÖ¾î¾ß ÇÕ´Ï´Ù. ±×·¯³ª Àý´ë·Î ÀÌ ÇÔ¼ö ¾È¿¡¼­ ÇÒ´çÇÑ Áö¿ª º¯¼ö¸é (automatic array) ¾ÈµË´Ï´Ù. ¿¹¸¦ µé¾î Àý´ë·Î ´ÙÀ½°ú °°ÀÌ ÇÏÁö ¸»±â ¹Ù¶ø´Ï´Ù:

  #include <stdio.h>

  char *itoa(int n)
  {
    char retbuf[20];           /* WRONG */
    sprintf(retbuf, "%d", n);
    return retbuf;             /* WRONG */
  }
ÇÔ¼ö°¡ ³¡³ª¸é, ÇÔ¼ö ¾È¿¡¼­ ¸¸µé¾îÁø automatic, local º¯¼ö´Â ¾ø¾îÁý´Ï´Ù. µû¶ó¼­ À§ °æ¿ì´Â ¿Ã¹Ù¸¥ Äڵ尡 ¾Æ´Õ´Ï´Ù (Áï, ¸®ÅϵǴ Æ÷ÀÎÅͰ¡ Á¸ÀçÇÏÁö ¾Ê´Â °÷À» °¡¸®Å°°í ÀÖ½À´Ï´Ù).

ÇÑ °¡Áö ¹æ¹ýÀº (¿ÏÀüÇÑ °ÍÀº ¾Æ´Õ´Ï´Ù. ƯÈ÷ ÀÌ ÇÔ¼ö°¡ Àç±ÍÀûÀ¸·Î È£ÃâµÇ°Å³ª µ¿½Ã¿¡ ÀÌ ÇÔ¼ö¸¦ ¿©·¯¹ø ºÎ¸£°í, ±× °ªÀ» »ç¿ëÇÏ·Á ÇÒ ¶§¿¡´Â ¾µ ¼ö ¾ø½À´Ï´Ù.) ¸®ÅÏÇÒ ¹öÆÛ¸¦ ´ÙÀ½°ú °°ÀÌ ¸¸µå´Â °ÍÀÔ´Ï´Ù:

  static char retbuf[20];

´Ù¸¥ ¹æ¹ýÀº, ÀÌ ÇÔ¼ö¸¦ ºÎ¸£´Â ÇÔ¼ö°¡, ¹öÆÛ¸¦ Á¦°øÇϵµ·Ï °íÄ¡´Â °ÍÀÔ´Ï´Ù:

  char *itoa(int n, char *retbuf)
  {
    sprintf(retbuf, "%d", n);
    return retbuf;
  }

  ...

    char str[20];
    itoa(123, str);

¶Ç, mallocÀ» ¾²´Â ¹æ¹ýµµ ÀÖ½À´Ï´Ù:

  #include <stdlib.h>

  char *itoa(int n)
  {
    char *retbuf = malloc(20);
    if (retbuf != NULL)
      sprintf(retbuf, "%d", n);
    return retbuf;
  }

  ...

    char *str = itoa(123);

ÀÌ °æ¿ì, ÀÌ ÇÔ¼ö¸¦ ºÎ¸£´Â ÂÊ¿¡¼­ ´õ ÀÌ»ó ÀÌ ÇÔ¼ö°¡ ¸®ÅÏÇÑ °ªÀÌ ÇÊ¿ä¾øÀ» °æ¿ì, ¸®ÅÏÇÑ Æ÷ÀÎÅͰ¡ °¡¸®Å°°í ÀÖ´Â ¸Þ¸ð¸®¸¦ freeÇØ ÁÖ¾î¾ß ÇÕ´Ï´Ù.

µ¡ºÙ¿© Áú¹® [*]7.5b, [*]12.21, [*]20.1µµ Âü°íÇϽñ⠹ٶø´Ï´Ù.

References
[ANSI] § 3.1.2.4
[C89] § 6.1.2.4



Q 7.5b
±×·³ ¹®ÀÚ¿­À̳ª ±âŸ ÀÌ·± °ÍµéÀ» ¸®ÅÏÇÏ·Á¸é ¾î¶»°Ô ÇØ¾ß ÇÏÁÒ?
Answer
Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÒ ¶§¿¡´Â ÀÌ Æ÷ÀÎÅͰ¡ Á¤ÀûÀ¸·Î ÇÒ´çµÈ (statically-allcated) °ø°£À» °¡¸®Å°°í ÀÖ¾î¾ß ÇÕ´Ï´Ù. ¶Ç´Â ÀÌ ¹öÆÛ°¡ ÀÌ ÇÔ¼ö¿¡ Àü´ÞµÈ ¸Þ¸ð¸®¸¦ °¡¸®Å°°í Àְųª, ÀÌ ¹öÆÛ°¡ malloc()À¸·Î ÇÒ´çµÈ ¹öÆÛÀ̾î¾ß ÇÕ´Ï´Ù. Àý´ë·Î Áö¿ª(local, automatic) ¹è¿­À» °¡¸®Å°°í À־´Â ¾ÈµË´Ï´Ù.

Áú¹® [*]20.1À» Âü°íÇϱ⠹ٶø´Ï´Ù.

7.2 Calling malloc

°íÁ¤µÈ ¸Þ¸ð¸® ºí·°À» ³Ñ¾î¼­, Á» ´õ ¸¹Àº À¯¿¬¼ºÀ» ÇÊ¿ä·Î ÇÑ´Ù¸é, ¸Þ¸ð¸®¸¦ µ¿ÀûÀ¸·Î ÇÒ´çÇÏ´Â ¹æ½ÄÀ» ¾µ ´Ü°èÀÔ´Ï´Ù. ´ë°³´Â malloc ÇÔ¼ö¸¦ ½á¼­ ÀÌ ÀÛ¾÷À» ¼öÇàÇÕ´Ï´Ù. ÀÌ section¿¡¼­´Â malloc¿¡ ´ëÇÑ ±âº»ÀûÀÎ »çÇ׿¡ ´ëÇÏ¿© ´Ù·ç¸ç, ´ÙÀ½ section¿¡¼­´Â mallocÀÌ ½ÇÆÐÇßÀ» °æ¿ì¿¡ ´ëÇÑ °ÍÀ» ¹è¿ó´Ï´Ù.



Q 7.6
malloc()À» È£ÃâÇÒ ¶§ ¿Ö ``warning: assignment of pointer from integer lacks a cast''¶ó´Â °æ°í°¡ ¹ß»ýÇÒ±î¿ä?
Answer
<stdlib.h>¸¦ Æ÷ÇÔÇϰųª, mallocÀ» ¾²±â À§ÇØ ¿Ã¹Ù¸¥ ¼±¾ðÀ» Á¦°øÇß´ÂÁö È®ÀÎÇϱ⠹ٶø´Ï´Ù. ¸¸¾à ÀÌ·± ÀÏÀ» ¾ÈÇß´Ù¸é, ÄÄÆÄÀÏ·¯´Â int¸¦ ¸®ÅÏÇÏ´Â °ÍÀ¸·Î (Áú¹® [*]1.25 Âü°í) °¡Á¤ÇÕ´Ï´Ù. ¹°·Ð ÀÌ °¡Á¤Àº À߸øµÈ °ÍÀÔ´Ï´Ù (°°Àº ÀÌÀ¯·Î, Áú¹®ÇÑ °æ°í ¸Þ½ÃÁö°¡ callocÀ̳ª realloc¿¡¼­ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù. µ¡ºÙ¿© Áú¹® [*]7.15µµ Âü°íÇϽñ⠹ٶø´Ï´Ù.
References
[H&S] § 4.7 p. 101



Q 7.7
¾î¶² Äڵ带 º¸¸é malloc()ÀÌ ¸®ÅÏÇÑ Æ÷ÀÎÅ͸¦ ´ëÀÔÇÒ Æ÷ÀÎÅÍÀÇ Å¸ÀÔÀ¸·Î ij½ºÆÃÇÑ °ÍÀ» º¼ ¼ö ÀÖ´Â µ¥, ¿Ö ±×·²±î¿ä?
Answer
ANSI/ISO C Ç¥ÁØ¿¡¼­ void *¸¦ ¼Ò°³µÇ±â Àü¿¡´Â, ´ë°³ Æ÷ÀÎÅÍ º¯È¯¿¡ °ü°èµÈ °æ°í¸¦ ¾ø¾Ö±â À§ÇØ, ¶Ç´Â ºÒÇÊ¿äÇÑ º¯È¯À» ÁÙÀ̱â À§ÇØ ÀÌ·¯ÇÑ Ä³½ºÆÃÀ» »ç¿ëÇß½À´Ï´Ù.

ANSI/ISO C Ç¥ÁØ¿¡¼­´Â ÀÌ·¯ÇÑ Ä³½ºÆÃÀÌ ÀüÇô ÇÊ¿ä¾ø½À´Ï´Ù. ±×¸®°í ÇöÀç ÀÌ·± ij½ºÆÃÀ» »ç¿ëÇÏ´Â °ÍÀº ³ª»Û ÇÁ·Î±×·¡¹Ö ½ºÅ¸ÀÏ·Î °£ÁֵDZ⵵ ÇÕ´Ï´Ù. ¿Ö³ÄÇϸé malloc()ÀÌ ¼±¾ðµÇÁö ¾Ê¾ÒÀ» ¶§ ¹ß»ýÇÒ ¼ö ÀÖ´Â À¯¿ëÇÑ °æ°í ¸Þ½ÃÁö¸¦ ¹ß»ý½ÃŰÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù; Áú¹® [*]7.6À» Âü°íÇϱ⠹ٶø´Ï´Ù. (±×·¯³ª ÀÌ·± ij½ºÆÃÀº ¿©ÀüÈ÷ ÀÚÁÖ ¾²À̰í ÀÖ½À´Ï´Ù. ¿Ö³ÄÇϸé C++¿¡¼­´Â ÀÌ·¯ÇÑ Ä³½ºÆÃÀÌ ¹Ýµå½Ã ÇÊ¿äÇϱ⠶§¹®¿¡, ȣȯ¼ºÀ» À¯ÁöÇϱâ À§Çؼ­ÀÔ´Ï´Ù.)

References
[H&S] § 16.1 pp. 386-7



Q 7.8
´ÙÀ½°ú °°Àº Äڵ带 º» ÀûÀÌ ÀÖ½À´Ï´Ù:
  char *p = malloc(strlen(s) + 1);
  strcpy(p, s);
Á¦ »ý°¢¿¡´Â malloc((strlen(s) + 1) * sizeof(char))·Î µÇ¾î¾ß ÇÒ °Í °°Àºµ¥¿ä.
Answer
sizeof(char)·Î °öÇÏ´Â °ÍÀº ÀüÇô ÇÊ¿ä ¾ø½À´Ï´Ù. ¿Ö³ÄÇϸé Á¤ÀÇ¿¡ ÀÇÇØ, sizeof(char)´Â Ç×»ó 1À̱⠶§¹®ÀÔ´Ï´Ù. ´Ù¸¥ ¸»·Î Çϸé sizeof(char)¸¦ °öÇÏ´Â °ÍÀº ÀüÇô ¹®Á¦°¡ µÇÁö ¾Ê½À´Ï´Ù. 1À» °öÇÏ´Â °ÍÀº ¾Æ¹«·± ¿µÇâÀ» ³¢Ä¡Áö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù. Ãß°¡ÀûÀ¸·Î size_t ŸÀÔÀ» ¾²´Â °ÍÀÌ µµ¿òÀÌ µÉ ¶§µµ ÀÖ½À´Ï´Ù. (Áú¹® [*]7.15 Âü°í) µ¡ºÙ¿© Áú¹® [*]8.9, [*]8.10µµ Âü°íÇϽñ⠹ٶø´Ï´Ù.
References
[ANSI] § 3.3.3.4
[C89] § 6.3.3.4
[H&S] § 7.5.2 p. 195



Q 7.9
´ÙÀ½°ú °°ÀÌ malloc()ÀÇ wrapper¸¦ ¸¸µé¾ú½À´Ï´Ù. ±×·±µ¥ ¿Ö µ¿ÀÛÇÏÁö ¾ÊÀ»±î¿ä?
  #include <stdio.h>
  #include <stdlib.h>

  mymalloc(void *retp, size_t size)
  {
    retp = malloc(size);
    if (retp == NULL) {
      fprintf(stderr, "out of memory\n");
      exit(EXIT_FAILURE);
    }
  }
Answer
Áú¹® [*]4.8À» Âü°íÇϱ⠹ٶø´Ï´Ù. (ÀÌ °æ¿ì, ¿©·¯ºÐÀº mymallocÀÌ ÇÒ´çµÈ °ø°£À» °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ µ¹·ÁÁÖµµ·Ï ÇØ¾ß ÇÕ´Ï´Ù.)



Q 7.10
Æ÷ÀÎÅ͸¦ ¼±¾ðÇÏ°í ¿©±â¿¡ °ø°£À» ÇÒ´çÇÏ·Á°í ÇÕ´Ï´Ù. ±×·±µ¥ Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â±º¿ä. ´ÙÀ½ Äڵ忡¼­ ¹¹°¡ À߸øµÇ¾ú³ª¿ä?
  char *p;
  *p = malloc(10);
Answer
Áú¹® [*]4.2¸¦ º¸±â ¹Ù¶ø´Ï´Ù.



Q 7.11
¹è¿­À» µ¿ÀûÀ¸·Î ÇÒ´çÇÒ ¼ö ÀÖÀ»±î¿ä?
Answer
Áú¹® [*]6.14¿Í [*]6.16À» º¸±â ¹Ù¶ø´Ï´Ù.



Q 7.12
¾µ ¼ö ÀÖ´Â ¸Þ¸ð¸® °ø°£ÀÌ ¾ó¸¶³ª ³²¾Æ ÀÖ´ÂÁö ¾Ë ¼ö ÀÖÀ»±î¿ä?
Answer
Áú¹® [*]19.22¸¦ º¸±â ¹Ù¶ø´Ï´Ù.



Q 7.13
malloc(0)Àº ¾î¶² °ªÀ» ¸®ÅÏÇÏ´Â °ÅÁÒ? ³Î Æ÷ÀÎÅ͸¦ ¸®ÅÏÇϳª¿ä, 0 ¹ÙÀÌÆ®¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¸®ÅÏÇϳª¿ä?
Answer
Áú¹® [*]11.26À» º¸±â ¹Ù¶ø´Ï´Ù.



Q 7.14
¾î¶² ½Ã½ºÅÛ¿¡¼­´Â malloc()À¸·Î ¸Þ¸ð¸®¸¦ ÇÒ´çÇØµµ ÇÁ·Î±×·¥¿¡¼­ ÀÌ ¸Þ¸ð¸®¿¡ Á¢±ÙÇϱâ Àü¿¡´Â ¿î¿µÃ¼Á¦°¡ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏÁö ¾Ê´Â´Ù°í µé¾ú½À´Ï´Ù. ±×·¡µµ »ó°ü¾øÀ»±î¿ä?
Answer
²Ï ¸»Çϱ⠾î·Á¿î ¹®Á¦ÀÔ´Ï´Ù. Ç¥ÁØ¿¡¼­´Â ÀÌ·± ½ÄÀ¸·Î µ¿ÀÛÇÏ´Â ½Ã½ºÅÛÀÌ ÀÖ´Ù°í ¸»ÇÑ ¹Ù°¡ ¾ø½À´Ï´Ù. ÇÏÁö¸¸, ¹Ý´ë·Î ±×·¯ÇÑ ½Ã½ºÅÛÀÌ ¾ø´Ù°í¸»ÇÑ ¹Ùµµ ¾ø½À´Ï´Ù. (ÀÌ¿Í °°Àº ``deferred failure'' implementationÀº Ç¥ÁØÀÌ ¿ä±¸ÇÏ´Â °Í°ú »ó°ü¾ø¾î º¸ÀÔ´Ï´Ù.)

½ÇÁ¦ ¸Þ¸ð¸®¿¡ ¾²·Á°í(write) ÇÒ ¶§, ³²¾Æ ÀÖ´Â ¸Þ¸ð¸®°¡ ¾ø´Â °æ¿ì°¡ ¹®Á¦°¡ µÇ´Âµ¥, C ¾ð¾î semantic¿¡´Â recourse°¡ ¾øÀ¸¹Ç·Î, ÀÌ °æ¿ì, ´ë°³ OS°¡ ÇØ´ç ÇÁ·Î±×·¥À» Á×À̰Ô(kill) µË´Ï´Ù. (´ç¿¬È÷, mallocÀº ¸Þ¸ð¸®°¡ ¾øÀ» °æ¿ì, ³Î Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÏ°Ô µÇ¹Ç·Î, mallocÀÇ ¸®ÅÏ °ªÀ» È®ÀÎÇß´Ù¸é, ÇÒ´çÇÑ ¸Þ¸ð¸®°¡ ¾Æ´Ñ ´Ù¸¥ ¸Þ¸ð¸®¿¡ Á¢±ÙÇÒ ±î´ßÀÌ ¾ø½À´Ï´Ù.)

ÀÌ¿Í °°ÀÌ ``lazy allocation'' ¹æ½ÄÀ» ¾²´Â ½Ã½ºÅÛ¿¡¼­´Â ´ë°³ ¸Þ¸ð¸®°¡ ºÎÁ·ÇÏ´Ù´Â °ÍÀ» ¾Ë·ÁÁÖ´Â ½Ã±×³ÎÀ» Á¦°øÇÕ´Ï´Ù. ±×·¯³ª ÇÁ·Î±×·¥¿¡¼­ ÀÌ ½Ã±×³ÎÀ» ó¸®ÇÏ·Á¸é À̽ļºÀÌ ¶³¾îÁö´Â ÇÁ·Î±×·¥ÀÌ µÉ °¡´É¼ºÀÌ ³ô½À´Ï´Ù. ÀÌ ¹æ½ÄÀ» Á¦°øÇÏ´Â ½Ã½ºÅÛ Áß¿¡´Â »ç¿ëÀÚ ¶Ç´Â ÇÁ·Î¼¼½º ´ÜÀ§·Î ÀÌ ±â´ÉÀ» ²ô´Â(off) ±â´ÉÀ» Á¦°øÇÏ´Â (Áï, ÀüÇüÀûÀÎ malloc semanticÀ» ¾²´Â) °Íµµ ÀÖ½À´Ï´Ù¸¸, ½Ã½ºÅÛ¸¶´Ù ¸Å¿ì ´Þ¶óÁý´Ï´Ù.

References
[ANSI] § 4.10.3
[C89] § 7.10.3

7.3 Problems with malloc



Q 7.15
¿Ö mallocÀÌ ÀÌ»óÇÑ °ªÀ» ¸®ÅÏÇÒ±î¿ä? Áú¹® [*]7.6À» ÀÐ°í³ª¼­ mallocÀ» ºÎ¸£±â Àü¿¡ extern void *malloc(); ¼±¾ðÀ» Æ÷ÇÔ½ÃÄ״µ¥µµ ÀÌ»óÇÑ ¾²·¹±â °ªÀ» ÁÝ´Ï´Ù.
Answer
mallocÀÇ ÀÎÀÚ Å¸ÀÔÀº size_tÀ̸ç, ¾Æ¸¶ unsigned long ŸÀÔÀÏ °¡´É¼ºÀÌ ³ô½À´Ï´Ù. ¸¸¾à¿¡ int ŸÀÔ(¶Ç´Â unsigned int)À» Àü´ÞÇß´Ù¸é, mallocÀÌ (±úÁø) ¾²·¹±â °ªÀ» ¹Þ¾ÒÀ» °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù. (¶Ç´Â long ŸÀÔÀ» Àü´ÞÇߴµ¥ size_t°¡ intÀÏ °æ¿ì¿¡µµ ÀÌ·² °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù.)

ÀϹÝÀûÀ¸·Î, Ç¥ÁØ ¶óÀ̺귯¸® ÇÔ¼öÀÇ ¼±¾ðÀ» externÀ¸·Î Á÷Á¢ ½á ÁÖ´Â °Íº¸´Ù ¾Ë¸Â´Â Çì´õ ÆÄÀÏÀ» Æ÷ÇÔ½ÃŰ´Â °ÍÀÌ ÈξÀ ´õ ¾ÈÀüÇÕ´Ï´Ù. µ¡ºÙ¿© Áú¹® [*]7.16µµ Âü°íÇϽñ⠹ٶø´Ï´Ù.

ºñ½ÁÇϸ鼭 Àß ¾Ë·ÁÁø ¶Ç ´Ù¸¥ ¹®Á¦´Â, size_t ŸÀÔÀÇ °ªÀ» (sizeofÀÇ °ª Æ÷ÇÔ) printfÀÇ %d¸¦ ½á¼­ Ãâ·ÂÇÏ´Â °ÍÀÔ´Ï´Ù. À̽ļºÀÌ ³ôÀº Äڵ带 ¾ò±â À§Çؼ­, ÁÖ¾îÁø °ªÀ» Á÷Á¢ (unsigned longÀ¸·Î) ij½ºÆÃÇÑ ´ÙÀ½ %lu Æ÷¸ËÀ¸·Î Ãâ·ÂÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù.

  printf("%lu\n", (unsigned long)sizeof(int));
µ¡ºÙ¿© Áú¹® [*]15.3µµ Âü°íÇϽñ⠹ٶø´Ï´Ù..
References
[ANSI] § 4.1.5, § 4.1.6
[C89] § 7.1.6, § 7.1.7
Note
C99 Ç¥ÁØÀº size_t¸¦ ½±°Ô Ãâ·ÂÇϱâ À§ÇØ, printf, scanf ÇÔ¼öµé¿¡ z modifier¸¦ Ãß°¡Çß½À´Ï´Ù. Áú¹® [*]13.1À» Âü°íÇϱ⠹ٶø´Ï´Ù.



Q 7.16
¾î¶² ¼öÇÐ °è»êÀ» Çϱâ À§ÇØ ²Ï Å« ¹è¿­ÀÌ ÇÊ¿äÇØ¼­ ´ÙÀ½°ú °°ÀÌ Äڵ带 ÀÛ¼ºÇß½À´Ï´Ù:
  double *array = malloc(256 * 256 * sizeof(double));
ÀÌ ¶§ malloc()Àº ³Î Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÏÁö ¾Ê¾ÒÁö¸¸ ÇÁ·Î±×·¥ÀÌ ¸Å¿ì ÀÌ»óÇÏ°Ô µ¿ÀÛÇÕ´Ï´Ù. Á¦ »ý°¢¿¡´Â ¸Þ¸ð¸®¸¦ °ãÃÄ ¾²´Â(overwrite) Çö»óÀÌ ¹ß»ýÇÑ °Í °°°Å³ª malloc()ÀÌ ¿øÇÏ´Â ¸¸Å­ÀÇ Å« ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ °Í °°Áö°¡ ¾Ê½À´Ï´Ù.
Answer
256 °öÇϱâ 256Àº 65,536À̸ç, int°¡ 16-bitÀÎ °æ¿ì, ÀúÀåµÉ ¼ö ¾ø´Â, Å« °ªÀÔ´Ï´Ù. °Ô´Ù°¡ ÀÌ ¼öÄ¡´Â ´Ù½Ã sizeof(double)·Î °öÇØ¾ß Çϱ⠶§¹®¿¡ »ó´çÈ÷ Å« Å©±âÀÔ´Ï´Ù. ÀÌ·± Å« ¹è¿­ÀÌ ²À ÇÊ¿äÇÏ´Ù¸é ²Ï ÁÖÀǸ¦ ±â¿ï¿©¾ß ÇÕ´Ï´Ù. ¸¸¾à ¿©·¯ºÐÀÇ ½Ã½ºÅÛ¿¡¼­ size_t ŸÀÔÀÌ (malloc()ÀÌ ÀÎÀÚ·Î ¹Þ´Â ŸÀÔ) 32 ºñÆ®¶ó¸é, ±×¸®°í int°¡ 16 ºñÆ®¶ó¸é, À§ Äڵ忡¼­ mallocÀÇ ÀÎÀÚ·Î 256 * (256 * sizeof(double))¸¦ ½á¼­ ÇØ°áÇÒ °¡´É¼ºµµ ÀÖ½À´Ï´Ù. (Áú¹® [*]3.14 Âü°í). ±×·¸Áö ¾Ê´Ù¸é ¿©·¯ºÐÀº ÀÌ ¸Þ¸ð¸®¸¦ ÀÛÀº Å©±â·Î Âɰ³¾î ¾²°Å³ª, ¶Ç´Â 32 ºñÆ® ÄÄÇ»Åͳª ÄÄÆÄÀÏ·¯¸¦ ¾²°Å³ª, ºñÇ¥ÁØÀ¸·Î Á¦°øµÇ´Â ¸Þ¸ð¸® ÇÒ´ç ÇÔ¼ö¸¦ ½á¾ß ÇÒ °ÍÀÔ´Ï´Ù. µ¡ºÙ¿© Áú¹® [*]7.15, [*]19.23µµ Âü°íÇϽñ⠹ٶø´Ï´Ù.

Note
ÀÌ Áú¹®Àº 16-bit ½Ã½ºÅÛ ¹× ÄÄÆÄÀÏ·¯°¡ ´ëºÎºÐÀÏ ½ÃÀý¿¡ ¸¸µé¾îÁø °ÍÀ̱⠶§¹®¿¡, Çö½Ç°ú °Å¸®°¡ ¸Ö ¼öµµ ÀÖÁö¸¸, ºñ½ÁÇÑ ÀÌÀ¯·Î 32-bit ½Ã½ºÅÛ¿¡¼­µµ ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖÀ¸¹Ç·Î ±×³É µÎ°Ú½À´Ï´Ù.



Q 7.17
Á¦ PC´Â 8 ¸Þ°¡ ¹ÙÀÌÆ®ÀÇ ¸Þ¸ð¸®¸¦ º¸À¯Çϰí ÀÖ½À´Ï´Ù. ±×·±µ¥ ¿Ö 640KÀÇ Å©±â ¹Û¿¡ ¾µ ¼ö ¾ø´Â °ÍÀϱî¿ä?
Answer
PC ȣȯÀÇ ¼¼±×¸ÕÆ®(segment) ±¸Á¶¸¦ »ç¿ëÇÏ´Â ÄÄÇ»ÅÍ¿¡¼­ 640K ÀÌ»óÀÇ ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´Â °ÍÀº (ƯÈ÷ MS-DOS¿¡¼­) ¸Å¿ì ¾î·Æ½À´Ï´Ù. Áú¹® [*]19.23À» Âü°íÇϱ⠹ٶø´Ï´Ù.



Q 7.18
Á¦ ÇÁ·Î±×·¥Àº ¾î¶² ³ëµå(¾î¶² ÀÚ·á ±¸Á¶)¸¦ µ¿ÀûÀ¸·Î ÇÒ´çÇÏ´Â ÀÛ¾÷À» ¸Å¿ì ¸¹ÀÌ ¼öÇàÇÕ´Ï´Ù. Å×½ºÆ® °á°ú malloc/free¿¡¼­ ¹ß»ýÇÏ´Â ¿À¹öÇìµå°¡ bottleneckÀÌ µÇ°í Àִµ¥, ÁÁÀº ¹æ¹ýÀÌ ÀÖÀ»±î¿ä?
Answer
¸¸¾à ÁÖ¾îÁø ³ëµåÀÇ Å©±â°¡ ¸ðµÎ °°´Ù¸é, free¸¦ ºÎ¸£´Â ´ë½Å¿¡ °³¹ßÀÚ°¡ Á÷Á¢ ¾²ÀÌÁö ¾Ê´Â ³ëµå·Î ÀÌ·ç¾îÁø ¸®½ºÆ®¸¦ °ü¸®ÇÏ´Â °ÍÀÌ ÁÁÀ» ¼ö ÀÖ½À´Ï´Ù. (ÀÌ ¹æ½ÄÀº, ÇÁ·Î±×·¥¿¡¼­ °¡Àå ¸¹Àº ¸Þ¸ð¸®¸¦ ¼ÒºñÇÏ´Â °ÍÀÌ ¹Ù·Î ÀÌ ³ëµåÀÏ ¶§ ÁÁÀº ÇØ°áÃ¥ÀÌ µË´Ï´Ù. ±×·¸Áö ¾Ê´Ù¸é ÀÌ ³ëµå ¸®½ºÆ®¿¡ ¹­¿© ÀÖ´Â ¸Þ¸ð¸®°¡ ¸¹¾Æ¼­ ´Ù¸¥ °÷¿¡¼­ ¸Þ¸ð¸®¸¦ ¾µ ¼ö ¾ø°Ô µÇ¾î ¹ö¸³´Ï´Ù.)
Note
»ç¿ëÀÚ°¡ Á÷Á¢ Á×Àº(dead) ³ëµåµéÀ» ¸®½ºÆ®¿¡ ÀúÀåÇØ µÎ°í, ÇÊ¿äÇÒ ¶§, mallocÀ» ºÎ¸£´Â ´ë½Å ÀÌ Á×Àº ³ëµå¸¦ Ȱ¿ëÇÏ´Â °ÍÀ», `object caching'À̶ó°í ºÎ¸£±âµµ ÇÕ´Ï´Ù.

¿¹¸¦ µé¾î, ¸®½ºÆ®ÀÇ ³ëµå°¡ ´ÙÀ½°ú °°À» °æ¿ì:

  struct node {
    struct node *next;
    ...
  };
±×¸®°í, »õ ³ëµå¸¦ ¸¸µå´Â ÇÔ¼ö¿Í ÇÊ¿ä¾ø´Â ³ëµå¸¦ »èÁ¦ÇÏ´Â ÇÔ¼ö°¡ ´ÙÀ½°ú °°´Ù°í °¡Á¤ÇսôÙ:
  struct node *new_node(void)
  {
    struct node *p;
    p = malloc(sizeof(*p));
    /* check if malloc() returns a null pointer */
    ...
    return p;
  }

  void delete_node(struct node *p)
  {
     ...
     free(p);
  }
ÀÌ °æ¿ì, ´ÙÀ½°ú °°Àº Àü¿ª º¯¼ö¸¦ µÎ°í,
  static struct node *grave = 0;
À§¿¡¼­ ¸¸µç µÎ ÇÔ¼ö¸¦ ``object caching'' ±â¹ýÀ» ¾²µµ·Ï ¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù:
  struct node *new_node(void)
  {
    struct node *p;
    if (grave) {
      p = grave;
      grave = p->next;
    }
    else {
      p = malloc(sizeof(*p));
      /* check if malloc() returns a null pointer */
    }
    ...
    return p;
  }

  void delete_node(struct node *p)
  {
     ...
     p->next = grave;
     grave = p;
  }
¹°·Ð ¼öÁ¤µÈ µÎ ÇÔ¼ö°¡ ¿Ïº®ÇÏÁö´Â ¾Ê½À´Ï´Ù. delete_node()´Â free¸¦ ºÎ¸£Áö ¾Ê°í, ÇÊ¿ä¾ø´Â ¸ðµç node¸¦ grave Æ÷ÀÎÅÍ¿¡ ¸®½ºÆ®·Î º¸°üÇϰí, ÇÊ¿äÇÑ °æ¿ì, (Áï new_node()¸¦ ºÒ·¶À» °æ¿ì) ¸®½ºÆ®¿¡ º¸°üµÈ ³ëµå¸¦ ´Ù½Ã ¾¹´Ï´Ù. ÃÖÀûÈ­¸¦ À§Çؼ­, ÀÏÁ¤ÇÑ °¹¼ö¸¸ grave ¸®½ºÆ®¿¡ º¸°üÇϰí, ³ª¸ÓÁö´Â free¸¦ ºÒ·¯¼­ ÇØÁ¦ÇÏ´Â ¹æ½ÄÀ¸·Îµµ ¸¸µé ¼ö ÀÖ½À´Ï´Ù.

ÀÌ·± ``object caching''ÀÌ ¸ðµç ¹®Á¦¸¦ ÇØ°áÇØ ÁÖÁö´Â ¾Ê½À´Ï´Ù. »óȲ¿¡ µû¶ó, ÀÌ ¹æ½ÄÀÌ µµ¿òÀÌ µÉ °æ¿ì°¡ ÀÖÀ¸¹Ç·Î, ¿©±â¿¡¼­ ¼Ò°³ÇÑ °ÍÀÌÁö, Ç×»ó ÁÁ´Ù´Â °ÍÀº ¾Æ´Ï¶ó´Â °ÍÀ» ±â¾ïÇϽñ⠹ٶø´Ï´Ù.



Q 7.19
Á¦ ÇÁ·Î±×·¥Àº malloc() ³»ºÎ¿¡¼­ ¿À·ù°¡ ¹ß»ýÇÑ °Í °°½À´Ï´Ù. ±×·±µ¥ Á¦°¡ º¸±â¿¡´Â Á¦ ÇÁ·Î±×·¥¿¡ À߸øµÈ ºÎºÐÀÌ ¾ø´Â °Í °°½À´Ï´Ù. malloc() ³»ºÎ¿¡ ¹ö±×°¡ ÀÖ´Â °Ô ¾Æ´Ò±î¿ä?
Answer
ºÒÇàÈ÷µµ, ÇÁ·Î±×·¡¸Ó°¡ malloc()ÀÌ ³»ºÎÀûÀ¸·Î À¯ÁöÇÏ´Â µ¥ÀÌÅÍ ±¸Á¶¸¦ ¸Á°¡¶ß¸®´Â °æ¿ì°¡ ÀÚÁÖ ¹ß»ýÇÕ´Ï´Ù. ¶Ç ±× °á°ú »ý±â´Â ¹®Á¦´Â ¸Å¿ì ´Ù·ç±â°¡ ¾î·Æ½À´Ï´Ù. °¡Àå ÈçÈ÷ ¹ß»ýÇÏ´Â ½Ç¼ö´Â, malloc()À¸·Î ÇÒ´çÇÑ ¸Þ¸ð¸®º¸´Ù ´õ ¸¹Àº µ¥ÀÌÅ͸¦ ¾²·Á°í(write) ÇÏ´Â °æ¿ìÀÔ´Ï´Ù; ƯÈ÷ ¹®ÀÚ¿­À» ÀúÀåÇϱâ À§ÇØ strlen(s) + 1À» ¾²Áö ¾Ê°í malloc(strlen(s))¸¦ ¾²´Â °æ¿ì°¡ ÈçÇÕ´Ï´Ù.7.2 ´Ù¸¥ ¹®Á¦·Î ÀÌ¹Ì free()¸¦ ºÒ·¯¼­ ¹ÝȯÇÑ ¸Þ¸ð¸® ºí·°¿¡ ¾²·Á°í(write) Çϰųª (Áú¹® [*]7.30 Âü°í), free()¸¦ °°Àº Æ÷ÀÎÅÍ¿¡ ´ëÇØ µÎ ¹ø È£ÃâÇÏ´Â °æ¿ìµµ ÀÖ½À´Ï´Ù. (ÀÌ Áß ¸î°¡Áö´Â Ç¥ÁØ¿¡ ÀÇÇØ ÀÎÁ¤µÇ°í ÀÖ½À´Ï´Ù. ANSI ȣȯ ½Ã½ºÅÛ¿¡¼­ Å©±â°¡ 0ÀÎ ¸Þ¸ð¸® ºí·°À» malloc, realloc µîÀ¸·Î ÇÒ´çÇϰųª, ³Î Æ÷ÀÎÅ͸¦ free()·Î ¹ÝȯÇÏ´Â °ÍÀº ¾Æ¹«·± ¹®Á¦µµ ÀÏÀ¸Å°Áö ¾Ê½À´Ï´Ù. ¹°·Ð ¿À·¡µÈ ½Ã½ºÅÛ¿¡¼­´Â ¹®Á¦°¡ µË´Ï´Ù.) ´ë°³ ÀÌ·¯ÇÑ ½Ç¼ö´Â ±Ý¹æ ¹ß°ßµÇÁö ¾Ê°í, ¿À·§µ¿¾È ¼û¾î Àְųª, ¶Ç´Â ÀüÇô »ó°ü¾ø´Â ÄÚµå ºÎºÐ¿¡¼­ ¿¡·¯°¡ ¹ß»ýÇÑ °Íó·³ º¸À̱⵵ ÇØ¼­ ¼öÁ¤ÇϱⰡ ¸Å¿ì ±î´Ù·Ó½À´Ï´Ù.

´ëºÎºÐ malloc implementationÀº Áß¿äÇÑ Á¤º¸¸¦ ÇÒ´çÇÑ ¸Þ¸ð¸® ¹Ù·Î ¿·¿¡ º¸°üÇϱ⠶§¹®¿¡, »ç¿ëÀÚ°¡ Æ÷ÀÎÅ͸¦ Á¶±ÝÀÌ¶óµµ À߸ø ¾²°Ô µÇ¸é, ½É°¢ÇÑ ¹®Á¦°¡ ¹ß»ýÇÕ´Ï´Ù.

µ¡ºÙ¿© Áú¹® [*]7.15, [*]7.26, [*]16.8, [*]18.2µµ Âü°íÇϽñ⠹ٶø´Ï´Ù.

7.4 Freeing Memory

Memory allocated with malloc can persist as long as you need it. It is never deallocated automatically (except when your program exits; see question [*]7.24). When your program uses memory on a transient basis, it can--and should--recycle it by calling free.



Q 7.20
µ¿ÀûÀ¸·Î ÇÒ´çÇÑ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÑ ´ÙÀ½¿¡´Â ´Ù½Ã ¾µ ¼ö ÀÖ³ª¿ä?
Answer
¾µ ¼ö ¾ø½À´Ï´Ù. ¾î¶² ¿À·¡µÈ malloc()¿¡ ´ëÇÑ ¹®¼­´Â ÇØÁ¦µÈ ¸Þ¸ð¸®´Â º¯°æµÇÁö ¾Ê´Â »óÅ·Π³²¾Æ ÀÖ´Ù°í (left undisturbed) ¾º¿© ÀÖÁö¸¸ ÀÌ´Â À߸øµÈ °ÍÀ̸ç, C Ç¥ÁØ¿¡µµ ¾ð±ÞµÇÁö ¾ÊÀº »çÇ×ÀÔ´Ï´Ù.

´ëºÎºÐÀÇ ÇÁ·Î±×·¡¸ÓµéÀÌ ¹ÝȯµÈ ¸Þ¸ð¸®ÀÇ ³»¿ëÀ» ÀϺη¯ ´Ù½Ã ¾²Áö´Â ¾Ê½À´Ï´Ù¸¸, ½Ç¼ö·Î ¹ÝȯÇÑ ¸Þ¸ð¸® °ø°£À» ¾²±âµµ ÇÕ´Ï´Ù. ´ÙÀ½¿¡ ³ª¿Â singly-linked ¸®½ºÆ®¸¦ ¹ÝȯÇÏ´Â Äڵ带 º¸½Ã±â ¹Ù¶ø´Ï´Ù:

  struct list *listp, *nextp;
  for (listp = base; listp != NULL; listp = nextp) {
    nextp = listp->next;
    free(listp);
  }
¸¸¾à À§ Äڵ尡 Àӽà º¯¼ö nextp¸¦ ¾²Áö ¾Ê°í, listp = listp->next¸¦ ½è´Ù¸é, ÀÌ¹Ì ¹ÝȯÇÑ ¸Þ¸ð¸®¸¦ listp->next·Î ´Ù½Ã Á¢±ÙÇÏ·Á ÇÑ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù.
References
[K&R2] § 7.8.5 p. 167
[ANSI] § 4.10.3
[C89] § 7.10.3
[ANSI Rationale] § 4.10.3.2
[H&S] § 16.2 p. 387
[CT&P] § 7.10 p. 95



Q 7.21
¿Ö free()¸¦ ºÎ¸¥ ´ÙÀ½¿¡ Æ÷ÀÎÅͰ¡ ³ÎÀÌ µÇÁö ¾Ê´Â °É±î¿ä?
Answer
free()¸¦ ºÎ¸£¸é ÀÌ ÇÔ¼ö¿¡ Àü´ÞµÈ Æ÷ÀÎÅͰ¡ °¡¸®Å°°í ÀÖ´ø ¸Þ¸ð¸®°¡ ÇØÁ¦µË´Ï´Ù. ±×·¯³ª ÀÌ Æ÷ÀÎÅÍ ÀÚüÀÇ °ªÀº º¯°æµÇÁö ¾Ê°í ³²¾ÆÀÖ½À´Ï´Ù. ¿Ö³ÄÇϸé C ¾ð¾î´Â ÀÎÀÚ¸¦ Àü´ÞÇÒ ¶§, `pass-by-value' °³³äÀ» ¾²±â ¶§¹®ÀÔ´Ï´Ù. µû¶ó¼­ ÇÔ¼ö°¡ (ÀÌ °æ¿ì free()) ÀÎÀÚ·Î Àü´ÞµÈ º¯¼öÀÇ °ªÀ» º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù. (Áú¹® 4.8À» Âü°íÇϱ⠹ٶø´Ï´Ù.)

ÀÏ´Ü ÇØÁ¦µÈ Æ÷ÀÎÅÍ °ªÀº ¾ö¹ÐÈ÷ ¸»Çؼ­, À¯È¿ÇÏÁö ¾Ê½À´Ï´Ù(invalid). ±×¸®°í (dereference°¡ ¾Æ´Ï´õ¶óµµ) ¾î¶°ÇÑ ¸ñÀûÀ¸·Î (½ÉÁö¾î, ´Ü¼øÈ÷ ´ëÀÔÇϰųª ºñ±³ÇÏ´Â °Íµµ) ÀÌ °ªÀ» ¾²´Â °ÍÀº, ¹°·Ð ±¸Çö ¹æ¹ý¿¡ µû¶ó ´Ù¸£±ä ÇÏÁö¸¸, ÀÌ·Ð»ó ¹®Á¦¸¦ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù. (¹°·Ð, ´ëºÎºÐÀÇ ½Ã½ºÅÛÀÌ ¹®Á¦°¡ ¾ø¾î º¸ÀÌ´Â invalid Æ÷ÀÎÅÍ ¾²ÀÓ»õ¸¦ ³Ê±×·´°Ô ºÁ ÁÖÁö¸¸, Ç¥ÁØÀº È®½ÇÇϰÔ, ¾î¶² °Íµµ º¸ÀåµÉ ¼ö ¾ø´Ù°í ¸»ÇÕ´Ï´Ù. ¶ÇÇÑ ¾î¶² ½Ã½ºÅÛÀº ±¸Á¶»ó ÀÌ·± exception »óȲÀÌ ÈçÈ÷ ¹ß»ýÇÕ´Ï´Ù.)

References
[ANSI] § 4.10.3
[C89] § 7.10.3
[ANSI Rationale] § 3.2.2.3



Q 7.22
ÇÔ¼ö¿¡ ¼ÓÇÑ Áö¿ª(local) Æ÷ÀÎÅÍ¿¡ malloc()À¸·Î ¸Þ¸ð¸®¸¦ ÇÒ´çÇßÀ» ¶§¿¡µµ ¹Ýµå½Ã free()¸¦ ÇØÁÖ¾î¾ß Çϳª¿ä?
Answer
´ç¿¬ÇÕ´Ï´Ù. Æ÷ÀÎÅÍ¿Í Æ÷ÀÎÅͰ¡ °¡¸®Å°´Â ¸Þ¸ð¸®´Â ¼­·Î ´Ù¸¥ °ÍÀ̶ó´Â °ÍÀ» ±â¾ïÇØ¾ß ÇÕ´Ï´Ù. ÇÔ¼ö°¡ ³¡³µÀ» ¶§, Áö¿ª º¯¼ö·Î ¼±¾ðÇÑ Æ÷ÀÎÅÍ´Â ÀÚµ¿À¸·Î ÇØÁ¦µÇÁö¸¸, Æ÷ÀÎÅÍ ÀÚü°¡ ÇØÁ¦µÈ´Ù´Â ¶æÀÌÁö, Æ÷ÀÎÅͰ¡ °¡¸®Å°´Â ¸Þ¸ð¸® ºí·°ÀÌ ÇØÁ¦µÈ´Ù´Â °ÍÀº ¾Æ´Õ´Ï´Ù. malloc()À¸·Î ÇÒ´çÇÑ ¸Þ¸ð¸®´Â free()¸¦ ½á¼­ ÇØÁ¦Çϱâ Àü¿¡´Â ¸Þ¸ð¸®¿¡ ³²¾Æ ÀÖ½À´Ï´Ù. ÀϹÝÀûÀ¸·Î ¸ðµç malloc()¿¡´Â °¢°¢ÀÇ È£Ãâ¿¡ ÇØ´çÇÏ´Â free()¸¦ ¸¸µé¾î ÁÖ¾î¾ß ÇÕ´Ï´Ù.



Q 7.23
µ¿ÀûÀ¸·Î ÇÒ´çÇÑ ¾î¶² ¿ÀºêÁ§Æ®¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇÏ´Â ±¸Á¶Ã¼¸¦ ÇÒ´çÇß½À´Ï´Ù. ÀÌ ±¸Á¶Ã¼¸¦ ÇØÁ¦ÇÒ ¶§, °¢°¢ÀÇ Æ÷ÀÎÅÍ ¸â¹ö°¡ °¡¸®Å°´Â ¸Þ¸ð¸®µµ µû·Î ÇØÁ¦ÇØ ÁÖ¾î¾ß Çϳª¿ä?
Answer
±×·¸½À´Ï´Ù. malloc()À¸·Î ÇÒ´çÇÑ ¸Þ¸ð¸®´Â °¢°¢, Á¤È®È÷ µü Çѹø, free() ÇØÁÖ¾î¾ß ÇÕ´Ï´Ù. ÇÁ·Î±×·¥¿¡¼­ °¢°¢ malloc()À¸·Î ÇÒ´çÇÑ ¸Þ¸ð¸®´Â ¸ðµÎ free()½ÃŰ´Â °ÍÀÌ ÁÁÀº ½À°üÀÔ´Ï´Ù.

Áú¹® [*]7.24¸¦ Âü°íÇϱ⠹ٶø´Ï´Ù.



Q 7.24
ÇÁ·Î±×·¥ÀÌ ³¡³ª±â Àü¿¡ µ¿ÀûÀ¸·Î ÇÒ´çÇÑ ¸Þ¸ð¸®´Â ¹Ýµå½Ã ÇØÁ¦½ÃÄÑ¾ß Çϳª¿ä?
Answer
±×·² ÇÊ¿ä´Â ¾ø½À´Ï´Ù. ÀϹÝÀûÀ¸·Î ¿î¿µÃ¼Á¦´Â ÇÁ·Î±×·¥ÀÌ ³¡³µÀ» ¶§, ÇÁ·Î±×·¥ÀÌ ÇÒ´çÇÑ ¸ðµç ¸Þ¸ð¸®¸¦ ÇØÁ¦½ÃÄÑ ÁÝ´Ï´Ù. ±×·³¿¡µµ ºÒ±¸Çϰí, ¾î¶² PC¿¡¼­´Â ¸Þ¸ð¸®¸¦ Á¦´ë·Î º¹¿ø½ÃŰÁö ¸øÇÑ´Ù°í ¾Ë·ÁÁ® ÀÖ½À´Ï´Ù. ANSI/[C89] C Ç¥ÁØ¿¡¼­´Â ÀÌ·±ÇÑ »óȲÀ» `±¸Çö ¼öÁØ¿¡ µû¸¥ »óȲ(quality of implementation issue)'À̶ó°í ¸»Çϰí ÀÖ½À´Ï´Ù.
References
[C89] § 7.10.3.2



Q 7.25
Á¦ ÇÁ·Î±×·¥Àº ¸Þ¸ð¸® ºí·°À» malloc()À¸·Î ÇÒ´çÇϰí, ³ªÁß¿¡ free()½ÃŰ´Â ±¸Á¶¸¦ °¡Áý´Ï´Ù. ±×·±µ¥, ÇÁ·Î±×·¥ÀÌ ³¡³­ ´ÙÀ½¿¡µµ, ¿î¿µ üÁ¦ÀÇ ¸Þ¸ð¸® »óŸ¦ »ìÆìº¸¸é ÀüÇô ÁÙ¾îµéÁö ¾Ê´Â °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.
Answer
´ëºÎºÐÀÇ malloc/freeÀÇ ±¸Çö ¹æ¹ýµéÀº ¸Þ¸ð¸®¸¦ ¿î¿µÃ¼Á¦¿¡ Áï½Ã ¹ÝȯÇÏ´Â °ÍÀÌ ¾Æ´Ï¸ç, ´ÜÁö ±× ÇÁ·Î±×·¥¿¡¼­ ³ªÁß¿¡ ³ª¿Ã malloc()ÀÌ ±× ¸Þ¸ð¸®¸¦ ´Ù½Ã ¾µ ¼ö ÀÖµµ·Ï ÇØ ÁÖµµ·Ï µÇ¾î ÀÖ½À´Ï´Ù.

7.5 Sizes of Allocated Blocks



Q 7.26
free() ÇÔ¼ö´Â ¾î´À Á¤µµ Å©±âÀÇ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÒ Áö ¾î¶»°Ô ¾Ë ¼ö ÀÖ´Â °ÍÀϱî¿ä?
Answer
malloc/free ±¸ÇöÀº µ¿ÀûÀ¸·Î ÇÒ´çÇÑ °¢°¢ÀÇ ¸Þ¸ð¸® ºí·°ÀÇ Å©±â¸¦ ³»ºÎÀûÀ¸·Î À¯ÁöÇϰí ÀÖ½À´Ï´Ù. µû¶ó¼­ free()¸¦ ¾µ ¶§¿¡ ±× Å©±â¸¦ ÁöÁ¤ÇÏÁö ¾Ê¾Æµµ ÀÚµ¿À¸·Î ±× Å©±â¸¦ ¾Ë ¼ö ÀÖ½À´Ï´Ù.



Q 7.27
±×·¸´Ù¸é, ÇÒ´çÇÑ ºí·°ÀÇ Å©±â°¡ ¾î´À Á¤µµÀÎÁö malloc ÆÐŰÁö¸¦ ½á¼­ ¾Ë ¼ö ÀÖÀ»±î¿ä?
Answer
ºÒÇàÇϰԵµ, µ¿Àû ºí·°ÀÇ Å©±â¸¦ ¾Ë ¼ö Àִ ǥÁØ ¶Ç´Â ȣȯ¼ºÀÖ´Â ¹æ¹ýÀº Á¦°øµÇÁö ¾Ê½À´Ï´Ù.



Q 7.28
¾î¶² Æ÷ÀÎÅͰ¡ ¸Þ¸ð¸®¸¦ °¡¸®Å°°í ÀÖÀ» ¶§, ¿Ö sizeof´Â ±× ¸Þ¸ð¸® ºí·°ÀÇ Å©±â¸¦ ¾Ë·ÁÁÖÁö ¾Ê³ª¿ä?
Answer
sizeof ¿¬»êÀÚ´Â Æ÷ÀÎÅͰ¡ °¡¸®Å°´Â °ªÀÌ mallocÀ¸·Î ÇÒ´çÇÑ ¸Þ¸ð¸®¸¦ °¡¸®Å°°í ÀÖ´ÂÁö ¾ËÁö ¸øÇÕ´Ï´Ù. sizeof°¡ ¾Ë·ÁÁÖ´Â °ÍÀº Æ÷ÀÎÅÍ ÀÚü°¡ Â÷ÁöÇϰí ÀÖ´Â Å©±âÀÔ´Ï´Ù. mallocÀ» ºÒ·¯¼­ ¾òÀº ¸Þ¸ð¸® ºí·°ÀÇ Å©±â¸¦ ¾Ë¾Æ³»´Â (À̽ļºÀÌ ³ôÀº) ¹æ¹ýÀº ¾ø½À´Ï´Ù.

7.6 Other Allocation Functions



Q 7.29
(Áú¹® [*]6.14¸¦ µû¶ó¼­) ¹è¿­À» µ¿ÀûÀ¸·Î ÇÒ´çÇÑ ´ÙÀ½, ÀÌ ¹è¿­ÀÇ Å©±â¸¦ ¹Ù²Ü ¼ö ÀÖÀ»±î¿ä?
Answer
¹°·ÐÀÔ´Ï´Ù. reallocÀÌ ¹Ù·Î ±× ¿ªÇÒÀ» ÇØ ÁÖ´Â ÇÔ¼öÀÔ´Ï´Ù. (¿¹¸¦ µé¾î, Áú¹® [*]6.14¿¡ ³ª¿Â °Íó·³ dynarray) µ¿ÀûÀ¸·Î ÇÒ´çµÈ ¹è¿­ÀÇ Å©±â¸¦ ¹Ù²Ù·Á¸é ´ÙÀ½°ú °°Àº Äڵ带 ¾¹´Ï´Ù:
  dynarray = (int *)realloc((void *)dynarray,
                            20 * sizeof(int));
reallocÀÌ Ç×»ó ¸Þ¸ð¸® ºí·°ÀÇ Å©±â¸¦ ´Ã¸®´Âµ¥7.3 ¾²ÀÌ´Â °ÍÀº ¾Æ´Õ´Ï´Ù. reallocÀº, °¡´ÉÇϸé, Àü´Þ¹ÞÀº ÀÎÀÚ¿Í °°Àº Æ÷ÀÎÅÍ °ªÀ» µ¹·ÁÁÖÁö¸¸, ¿äûÇÑ Å©±â¿¡ ¸Â°Ô ¸Þ¸ð¸® ºí·°À» ´Ù½Ã ãÀ» °æ¿ì¿¡´Â, ÀÎÀÚ·Î Àü´ÞµÈ Æ÷ÀÎÅÍ °ª°ú´Â ´Ù¸¥ °ªÀ» µ¹·ÁÁÝ´Ï´Ù. ÀÌ °æ¿ì, ÀÎÀÚ·Î Àü´ÞµÈ Æ÷ÀÎÅÍ °ªÀº ´õ ÀÌ»ó ¾µ ¼ö ¾ø½À´Ï´Ù.

¸¸¾à reallocÀÌ ¿äûÇÑ ¸Þ¸ð¸® °ø°£À» ãÁö ¸øÇß´Ù¸é, ³Î Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÕ´Ï´Ù. ÀÌ ¶§, ÀÎÀÚ·Î Àü´ÞµÇ¾ú´ø ¸Þ¸ð¸®´Â (reallocÀ» ºÎ¸£±â ¹Ù·Î Àü »óÅ·Î) ±×´ë·Î À¯ÁöµË´Ï´Ù.7.4

reallocÀ» ½á¼­ ¸Þ¸ð¸®ÀÇ Å©±â¸¦ º¯°æÇßÀ» °æ¿ì¿¡, ´Ù¸¥ Æ÷ÀÎÅͰ¡ ÀÌ ¸Þ¸ð¸® °ø°£À» °¡¸®Å°°í ÀÖ¾ú´ÂÁö (``alias''¶ó´Â ¿ë¾î¸¦ ¾¹´Ï´Ù) ÁÖÀÇÇØ¾ß ÇÕ´Ï´Ù: ¸¸¾à¿¡ reallocÀÌ ´Ù¸¥ °÷¿¡ ¸Þ¸ð¸® ºí·°À» ÇÒ´çÇß´Ù¸é, ´Ù¸¥ Æ÷ÀÎÅ͵鵵 °ªÀÌ ¿Ã¹Ù¸£°Ô ¹Ù²î¾î¾ß ÇÕ´Ï´Ù. (mallocÀÇ ½ÇÆÐ ¿©ºÎ¸¦ È®ÀÎÇÏÁö ¾Ê¾Ò´Ù´Â ´ÜÁ¡ÀÌ ÀÖ±ä ÇÏÁö¸¸) ´©±º°¡°¡ Á¦°øÇÑ ÄÚµåÀÔ´Ï´Ù:

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

  char *p, *p2, *newp;
  int tmpoffset;

  p = malloc(10);
  strcpy(p, "Hello,");    /* p is a string */
  p2 = strchr(p, ',');    /* p2 points into that string */

  tmpoffset = p2 - p;
  newp = realloc(p, 20);
  if (newp != NULL) {
    p = newp;                   /* p may have moved */
    p2 = p + tmpoffset;         /* relocate p2 as well */
    strcpy(p2, ", world");
  }

  printf("%s\n", p);
À§¿Í °°ÀÌ ±âº»°ª(base)À» ±âÃÊ·Î ÇØ¼­ Æ÷ÀÎÅÍ °ªÀ» ´Ù½Ã °è»êÇÏ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÕ´Ï´Ù. ´Ù¸¥ ¹æ¹ýÀº-µÎ °ªÀÇ Â÷(difference)ÀÎ newp - pÀÇ °ªÀ» ±âÃÊ·Î, reallocÀ» ºÎ¸£±â Àü, ÈÄÀÇ º£À̽º Æ÷ÀÎÅÍÀÇ °ªÀ» ¾²´Â ¹æ½Ä- µ¿ÀÛÇÑ´Ù°í º¸ÀåÇÒ ¼ö ¾ø½À´Ï´Ù. ¿Ö³ÄÇϸé, Æ÷ÀÎÅÍ »¬¼ÀÀº °°Àº ¿ÀºêÁ§Æ®¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ »çÀÌ¿¡¼­¸¸ Àǹ̰¡ Àֱ⠶§¹®ÀÔ´Ï´Ù. µ¡ºÙ¿© Áú¹® [*]7.12, [*]7.30µµ Âü°íÇϽñ⠹ٶø´Ï´Ù..
References
[K&R2] § B5 p. 252
[ANSI] § 4.10.3.4
[C89] § 7.10.3.4
[H&S] § 16.3 pp. 387-8



Q 7.30
realloc ÇÔ¼öÀÇ Ã¹¹øÂ° ÀÎÀÚ·Î ³Î Æ÷ÀÎÅ͸¦ Àü´ÞÇÏ´Â °ÍÀÌ ¾ÈÀüÇѰ¡¿ä? ±×¸®°í ¿Ö ±×·± ÀÏÀ» ÇÏ´Â °ÍÀÌÁÒ?
Answer
ANSI C Ç¥ÁØÀº ±×·± ½ÄÀ¸·Î ½áµµ (±×¸®°í realloc(..., 0)ó·³ ½á¼­ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÏ´Â °Í) ±¦Âú´Ù°í ¸»ÇÕ´Ï´Ù. ±×·¯³ª ´ëºÎºÐÀÇ ¿À·¡µÈ ±¸Çö ¹æ¹ý¿¡¼­´Â ÀÌ·¯ÇÑ »ç¿ë¹ýÀ» Á¦°øÇÏÁö ¾Ê½À´Ï´Ù. µû¶ó¼­ Ç¥ÁØÀ̱â´Â ÇÏÁö¸¸ ¿ÏÀüÈ÷ ȣȯ¼ºÀ» °®Ãá ¹æ¹ýÀÌ ¾Æ´Õ´Ï´Ù. reallocÀÇ Ã¹ ÀÎÀÚ·Î ³Î Æ÷ÀÎÅ͸¦ Àü´ÞÇÏ¸é ¸Þ¸ð¸®¸¦ Áõ°¡ÀûÀ¸·Î µ¿ÀûÀ¸·Î ÇÒ´çÇÏ´Â ¾Ë°í¸®ÁòÀ» (self-starting incremental allocation algorithm) ¸¸µé±â ½±½À´Ï´Ù.
References
[C89] § 7.10.3.4
[H&S] § 16.3 p. 388



Q 7.31
calloc()°ú malloc()ÀÇ Â÷ÀÌ´Â ¹«¾ùÀΰ¡¿ä? calloc()ÀÌ ¸Þ¸ð¸®¸¦ 0À¸·Î ¸¸µå´Â °ÍÀ» ¹Ï°í ¾µ ¼ö ÀÖ³ª¿ä? ±×¸®°í, calloc()À¸·Î ÇÒ´çÇÑ ¸Þ¸ð¸®¸¦ free()¸¦ ½á¼­ ÇØÁ¦ÇÒ ¼ö ÀÖ³ª¿ä? ¾Æ´Ï¸é cfree()¿Í °°Àº °ÍÀ» »ç¿ëÇϳª¿ä?
Answer
calloc()Àº ´ÙÀ½ÀÇ Äڵ带 ¼öÇàÇÏ´Â °Í°ú °°½À´Ï´Ù:
  p = malloc(m * n);
  memset(p, 0, m * n);
0À¸·Î ä¿î´Ù´Â °ÍÀº ÇÒ´çÇÑ ¸Þ¸ð¸®ÀÇ ¸ðµç ºñÆ®¸¦ 0À¸·Î ä¿î´Ù´Â ¶æÀÔ´Ï´Ù. µû¶ó¼­ ÀÌ °ªÀÌ ³Î Æ÷ÀÎÅͰ¡ ¾Æ´Ò ¼öµµ ÀÖÀ¸¸ç(¿©±â¿¡ °üÇÑ °ÍÀº 5 ÀýÀ» Âü°íÇϱ⠹ٶø´Ï´Ù.) ½Ç¼ö(floating-point)·Î 0ÀÌ ¾Æ´Ò ¼öµµ ÀÖ½À´Ï´Ù. ±×¸®°í calloc()À¸·Î ÇÒ´çÇÑ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÒ ¶§¿¡µµ free()¸¦ ¾¹´Ï´Ù.
References
[C89] § 7.10.3ºÎÅÍ 7.10.3.2
[H&S] § 16.1 p. 386, § 16.2 p. 386
[PCS] § 11 pp. 141-142



Q 7.32
alloca() ÇÔ¼ö´Â ¾î¶² ÇÔ¼öÀ̸ç, ¿Ö ¾²Áö ¸»¶ó°í ÇÏÁÒ?
Answer
alloca()´Â ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ ÇÔ¼ö°¡ ³¡³¯ ¶§, ÀÚµ¿À¸·Î ÇÒ´çÇÑ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇØ ÁÖ´Â ÇÔ¼öÀÔ´Ï´Ù. Áï, alloca·Î ÇÒ´çÇÑ ¸Þ¸ð¸®´Â ƯÁ¤ ÇÔ¼öÀÇ ``½ºÅà ÇÁ·¹ÀÓ(stack frame)''À̳ª ¹®¸Æ(context)¿¡ Á¾¼ÓÀûÀÔ´Ï´Ù.

alloca() ÇÔ¼ö´Â À̽ļºÀÖ°Ô ¸¸µé ¼ö°¡ ¾ø½À´Ï´Ù. ±×¸®°í ÀϹÝÀûÀÎ ½ºÅÃÀ» »ç¿ëÇÏÁö ¾Ê´Â ÄÄÇ»ÅÍ¿¡¼­´Â ¸Å¿ì ¸¸µé±â ¾î·Á¿î ÇÔ¼öÀÔ´Ï´Ù. ƯÈ÷ alloca·Î ÇÒ´çÇÑ ¸Þ¸ð¸®¸¦ ¸®ÅÏÇÏ´Â °æ¿ì, ½É°¢ÇÑ ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¸é:

  fgets(alloca(100), 100, stdin);

ÀÌ·± ÀÌÀ¯¿¡¼­ alloca ÇÔ¼ö´Â Ç¥ÁØ ÇÔ¼ö°¡ ¾Æ´Ï¸ç, ³ôÀº À̽ļºÀÌ ¿ä±¸µÇ´Â ÇÁ·Î±×·¥¿¡¼­´Â (¸Å¿ì ¾µ¸ð ÀÖ±â´Â ÇÏÁö¸¸) ¾µ ¼ö ¾ø½À´Ï´Ù.

Áú¹® [*]7.22¸¦ Âü°íÇϱ⠹ٶø´Ï´Ù.

References
[ANSI Rationale] § 4.10.3


next up previous contents
Next: 8. Characters and Strings Up: C Programming FAQs Previous: 6. Arrays and Pointers

All rights reserved. Copyright © 2004-2006 Seong-Kook Shin (½Å¼º±¹)
Return to my homepage


2006-08-30
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.