Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
7. Memory Allocation
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 ¾ð¾î´Â »ó´ëÀûÀ¸·Î Àú¼öÁØÀÇ ¾ð¾îÀ̱⠶§¹®¿¡,
ÇÁ·Î±×·¡¸Ó°¡ ¸Þ¸ð¸®¸¦ Á÷Á¢ ÇÒ´çÇØ¾ß ÇÕ´Ï´Ù.
Á¦´ë·Î ÇÒ´çµÇÁö ¾ÊÀº ¸Þ¸ð¸®¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¾²´Â °ÍÀº ½É°¢ÇÑ ¹ö±×¸¦
¹ß»ýÇÏ´Â °¡Àå ÁÖµÈ ¿øÀÎÀÌ µË´Ï´Ù.
¿©·¯ºÐÀÌ Á÷Á¢
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À» Âü°íÇϱ⠹ٶø´Ï´Ù.
°íÁ¤µÈ ¸Þ¸ð¸® ºí·°À» ³Ñ¾î¼, Á» ´õ ¸¹Àº À¯¿¬¼ºÀ» ÇÊ¿ä·Î ÇÑ´Ù¸é, ¸Þ¸ð¸®¸¦
µ¿ÀûÀ¸·Î ÇÒ´çÇÏ´Â ¹æ½ÄÀ» ¾µ ´Ü°èÀÔ´Ï´Ù. ´ë°³´Â
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
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µµ Âü°íÇϽñ⠹ٶø´Ï´Ù.
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 () ÀÌ ±× ¸Þ¸ð¸®¸¦ ´Ù½Ã ¾µ ¼ö ÀÖµµ·Ï ÇØ ÁÖµµ·Ï µÇ¾î
ÀÖ½À´Ï´Ù.
Q 7.26
free () ÇÔ¼ö´Â ¾î´À Á¤µµ Å©±âÀÇ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÒ Áö
¾î¶»°Ô ¾Ë ¼ö ÀÖ´Â °ÍÀϱî¿ä?
Answer
malloc/free ±¸ÇöÀº µ¿ÀûÀ¸·Î ÇÒ´çÇÑ °¢°¢ÀÇ ¸Þ¸ð¸® ºí·°ÀÇ Å©±â¸¦
³»ºÎÀûÀ¸·Î À¯ÁöÇϰí ÀÖ½À´Ï´Ù. µû¶ó¼ free () ¸¦ ¾µ ¶§¿¡
±× Å©±â¸¦ ÁöÁ¤ÇÏÁö ¾Ê¾Æµµ ÀÚµ¿À¸·Î ±× Å©±â¸¦ ¾Ë ¼ö ÀÖ½À´Ï´Ù.
Q 7.27
±×·¸´Ù¸é, ÇÒ´çÇÑ ºí·°ÀÇ Å©±â°¡ ¾î´À Á¤µµÀÎÁö malloc
ÆÐŰÁö¸¦ ½á¼ ¾Ë ¼ö ÀÖÀ»±î¿ä?
Answer
ºÒÇàÇϰԵµ, µ¿Àû ºí·°ÀÇ Å©±â¸¦ ¾Ë ¼ö Àִ ǥÁØ ¶Ç´Â ȣȯ¼ºÀÖ´Â
¹æ¹ýÀº Á¦°øµÇÁö ¾Ê½À´Ï´Ù.
Q 7.28
¾î¶² Æ÷ÀÎÅͰ¡ ¸Þ¸ð¸®¸¦ °¡¸®Å°°í ÀÖÀ» ¶§, ¿Ö sizeof ´Â ±× ¸Þ¸ð¸®
ºí·°ÀÇ Å©±â¸¦ ¾Ë·ÁÁÖÁö ¾Ê³ª¿ä?
Answer
sizeof ¿¬»êÀÚ´Â Æ÷ÀÎÅͰ¡ °¡¸®Å°´Â °ªÀÌ malloc À¸·Î ÇÒ´çÇÑ
¸Þ¸ð¸®¸¦ °¡¸®Å°°í ÀÖ´ÂÁö ¾ËÁö ¸øÇÕ´Ï´Ù. sizeof °¡ ¾Ë·ÁÁÖ´Â °ÍÀº
Æ÷ÀÎÅÍ ÀÚü°¡ Â÷ÁöÇϰí ÀÖ´Â Å©±âÀÔ´Ï´Ù. malloc À» ºÒ·¯¼ ¾òÀº
¸Þ¸ð¸® ºí·°ÀÇ Å©±â¸¦ ¾Ë¾Æ³»´Â (À̽ļºÀÌ ³ôÀº) ¹æ¹ýÀº ¾ø½À´Ï´Ù.
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: 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