ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : docbook>µ¿Àû_¸Þ¸ð¸®ÇÒ´ç
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
HTML º¯È¯¹®¼
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
<article lang="ko">
<!-- -->
<!-- ¹®¼ Á¤º¸ -->
<!-- -->
<articleinfo>
<title>µ¿Àû ¸Þ¸ð¸®ÇÒ´ç</title>
<author>
<surname>À± »ó¹è</surname>
<affiliation>
<address>
<email>dreamyun@yahoo.co.kr</email>
</address>
</affiliation>
</author>
</articleinfo>
<!-- -->
<!-- ¼½¼Ç ½ÃÀÛ -->
<!-- -->
<section>
<title>¼Ò°³</title>
<para>
¾î¶² ¾ð¾î¸¦ ÀÌ¿ëÇØ¼ ÇÁ·Î±×·¡¹ÖÀ» ÇϵçÁö ÇÁ·Î±×·¥ÀÌ ÇÏ´Â ÁÖ¿äÇÑ
ÀÓ¹«´Â °á±¹ µ¥ÀÌŸ¸¦ ÁÖ°í/¹Þ°í À̸¦ °¡°øÇÏ´Â ÀÛ¾÷ÀÌ´Ù.
ÀÌ´Â »ç¶÷ÀÌ »çȸ¿¡¼ »ì¾Æ°¡±â À§ÇÑ °¡Àå ÁÖ¿äÇÑ ÀÏÀÌ ¼·Î°£ÀÇ
´ëÈÀΰͰú ¸¶Âù°¡ÁöÀÌ´Ù.
</para>
<para>
»ç¶÷Àº ¼·Î ´ëȸ¦ Çϱâ À§Çؼ ´ëÈÇÒ ³»¿ëÀ» ¹Ì¸® ¾îµò°¡¿¡ ÀúÀåÇϰí
ÀÖ¾î¾ß ÇÑ´Ù. »ç±³¸¦ À§ÇÑ ´ëȸ¦ À§Çؼ¶ó¸é ¸Ó¸®¿¡ ÀúÀåµÇ¾î ÀÖ´Â
(ÀúÀåÀ̶ó°í ¸»ÇÏ´Ï Á» ÀÌ»óÇϱäÇÏ´Ù --;) µ¥ÀÌŸ(°æÇè)¸¦ Ȱ¿ëÇØ¼
´ëȸ¦ ÇÏ¸é µÉ°ÍÀ̰í, ¾÷¹«»ó Áß¿äÇÑ ´ëȶó¸é, ¹Ì¸® ³ëÆ®¸¦ ÇϵçÁö
ÇØ¼ ½ÇÁ¦ ´ëȶ§ Áß¿äÇÑ ³»¿ëÀ» ºüÆ®¸®Áö ¾Êµµ·Ï Áغñ¸¦ ÇØ¾ß ÇÒ°ÍÀÌ´Ù.
</para>
<para>
ÇÁ·Î±×·¥µµ ¸¶Âù°¡Áö·Î ¾î¶² ¼öÇàÀ» À§Çؼ´Â µ¥ÀÌŸ¸¦ ¾îµò°¡¿¡ ÀúÀåÇØ
µÎ°í ÀÖ¾î¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ·¯ÇÑ µ¥ÀÌŸ ÀÇ ÀúÀåÀº ¸Þ¸ð¸®°ø°£
ȤÀº µð½ºÅ© °ø°£À» ÀÌ¿ëÇÑ´Ù.
</para>
<para>
À̹®¼´Â µ¥ÀÌŸÀúÀåÀ» À§Çؼ ¾î¶»°Ô ¸Þ¸ð¸® °ø°£À»
ÀÌ¿ëÇØ¾ß ÇÏ´ÂÁö¿¡ ´ëÇÑ ³»¿ëÀ» ´Ù·ç°í ÀÖ´Ù.
</para>
</section>
<section>
<title>¸Þ¸ð¸® ÇÒ´ç</title>
<para>
¸Þ¸ð¸® ÇÒ´çÀ» À§ÇÑ ¹æ¹ýÀº Å©°Ô 2°¡Áö°¡ ÀÖ´Ù. Á¤Àû¸Þ¸ð¸® ÇÒ´ç°ú
µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀÌ ±×°ÍÀε¥, µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ» ¼³¸íÇϱâ Àü¿¡
Á¤Àû ¸Þ¸ð¸® ÇÒ´ç¿¡ ´ëÇØ °£´ÜÈ÷ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.
</para>
<section>
<title>Á¤Àû ¸Þ¸ð¸® ÇÒ´ç¿¡ ´ëÇØ¼</title>
<para>
Static Memory Allocation À̶ó°í ºÒ¸®¿ì¸ç,
¸Þ¸ð¸®ÀÇ Å©±â°¡ ¹Ì¸® °íÁ¤½ÃÄѼ ÇÒ´çÇÏ´Â °ÍÀ» ¸»ÇÑ´Ù.
ÀϹÝÀûÀ¸·Î ¸Þ¸ð¸®Å©±â¸¦ ÇÒ´çÇÏ´Â ½¬¿î ¹æ¹ýÀ¸·Î, ÇÒ´ç½ÃÄÑÁà¾ßÇÒ
¸Þ¸ð¸®ÀÇ ÇѰè Å©±â¸¦ ¸íÈ®È÷ ¾Ë°í ÀÖÀ»°æ¿ì »ç¿ëÇÑ´Ù.
</para>
<para>
¿¹¸¦ µé¾î ÁÖ¼Ò¸¦ ÀúÀåÇϱâ À§ÇÑ ¸Þ¸ð¸® °ø°£ÀÌ ÇÊ¿äÇÏ´Ù°í ÇÒ¶§,
¿ì¸®´Â ÁÖ¼Ò¸¦ ÀúÀåÇϱâ À§Çؼ ¾î´ÀÁ¤µµÀÇ ¸Þ¸ð¸® °ø°£ÀÌ ÇÊ¿äÇÑÁö¸¦
´ëÃæ °è»êÇÒ¼ö ÀÖ´Ù. ÁÖ¼Ò±æÀ̰¡ ¾Æ¹«¸® ±æ¾îºÁ¾ß 256 ÀÚ¸¦ ³ÑÁö
¾ÊÀ»°ÍÀ̱⠶§¹®ÀÌ´Ù.
</para>
<para>
ÀÌ·¯ÇÑ Á¤Àû ¸Þ¸ð¸® ÇÒ´çÀº ÇÁ·Î±×·¥ ½ÃÀ۽ÿ¡ ¹Ì¸® °íÁ¤½ÃÄѼ
ÇÒ´ç½ÃÄÑ ¹ö¸°´Ù.(±×·± ÀÌÀ¯·Î Static À̶ó°í ºÎ¸®±âµµ ÇÑ´Ù)
<screen>
...
int main()
{
char address[256];
char zipcode[10];
...
...
}
</screen>
Á¤ÀûÀ¸·Î ¸Þ¸ð¸®¸¦ ÇÒ´çÇÒ°æ¿ì ¾à°£ÀÇ ¸Þ¸ð¸® ³¶ºñ°¡ ÀÖÀ»¼ö ÀÖ´Ù.
º¸Åë ÇÒ´çÇÒ ¸Þ¸ð¸®¸¦ °áÁ¤ÇÒ¶§, ÃÖ´ë »ç¿ë°¡´ÉÇÏ´Ù°í »ý°¢µÇ´Â
¸Þ¸ð¸®·®º¸´Ù ¾à°£´õ Å©°Ô Àâ´Â°Ô º¸ÅëÀ̱⠶§¹®ÀÌ´Ù.
</para>
<para>
±×·¯³ª Å©±âÀÇ ÇѰ踦 ¸íÈ®È÷ ¾Ë¼ö ÀÖÀ»°æ¿ì, µ¿Àû ¸Þ¸ð¸® ÇҴ纸´Ù
»ç¿ëÇϱ⠽±°í, ¹ö±×°¡ ¹ß»ýÇÒ È®·üµµ Àû´Ù´Â ÀåÁ¡À» °¡Áö°í ÀÖ´Ù.
º¸Åë ÇÁ·ÎÁ§Æ®¸¦ ÁøÇàÇÏ°Ô µÉ°æ¿ì ¾à°£ÀÇ ¸Þ¸ð¸® ³¶ºñº¸´Ù´Â
¹ö±×ÀÇ ¹ß»ýÀ» ´õÅ« ÇÁ·Î±×·¥ À§Çè¿ä¼Ò·Î »ý°¢Çϱ⠶§¹®¿¡,
°¡´ÉÇÑÇÑ Á¤Àû ¸Þ¸ð¸® ÇÒ´çÀ» »ç¿ëÇÑ´Ù.
µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ» »ç¿ëÇÒ°æ¿ì ¸Þ¸ð¸® ´©¼ö, È¥µ¿µÇ´Â Æ÷ÀÎÅÍÀÇ
»ç¿ë¿¡ ÀÇÇÑ À߸øµÈ ¸Þ¸ð¸® ÂüÁ¶µî ¿©·¯°¡Áö
¹®Á¦¸¦ ¹ß»ý½Ãų¼ö Àֱ⠶§¹®ÀÌ´Ù. Æ÷ÀÎÅÍ À߸ø»ç¿ëÇØ¼ ¹ß»ýÇÏ´Â
¹®Á¦°¡ ¾ó¸¶³ª ÇÁ·Î±×·¡¸Ó¸¦ ±«·ÓÈ÷´ÂÁö´Â ¸»ÇÏÁö ¾Ê¾Æµµ
Àß ¾Ë°í ÀÖÀ¸¸®¶ó »ý°¢µÈ´Ù.
</para>
</section>
<section>
<title>µ¿Àû ¸Þ¸ð¸® ÇÒ´ç¿¡ ´ëÇØ¼</title>
<para>
Dynamic Memory Allocation À̶ó°í ºÒ¸®¿ì¸ç,
¸»±×´ë·Î ÇÁ·Î±×·¥ ½ÇÇàÁß¿¡ µ¿ÀûÀ¸·Î ¸Þ¸ð¸®ÀÇ Å©±â¸¦ ÇÒ´ç½ÃÄÑÁà¾ß
ÇÒ Çʿ䰡 ÀÖÀ»°æ¿ì »ç¿ëÇÑ´Ù.
</para>
<para>
¿¹¸¦ µé¾î¼ °£´ÜÇÑ ¿¡µðÅÍ ÇÁ·Î±×·¥À» ¸¸µç´Ù°í ÇßÀ»¶§,
º¸Åë ÆÄÀÏÀÇ ³»¿ëÀ» ¸Þ¸ð¸® »ó¿¡ ÀÐ¾î µéÀÌ°Ô µÉ°ÍÀÌ´Ù.
±×·±µ¥ ÆÄÀÏÀÇ Å©±â°¡ ¾ó¸¶°¡ µÉÁö´Â ¾Æ¹«µµ ¾Ë¼ö ¾ø´Ù.
ÆÄÀÏÀÌ ÀÛÀ»°æ¿ì ±× Å©±â°¡ 0ÀÌ µÉ¼öµµ ÀÖ°ÚÁö¸¸ ÆÄÀÏÀÌ Å¬°æ¿ì
¼ö½Ê ¸Þ°¡ ¹ÙÀÌÆ® ȤÀº ±× ÀÌ»óÀÌ µÉ¼öµµ ÀÖÀ»°ÍÀ̱⠶§¹®ÀÌ´Ù.
À̰æ¿ì¿¡´Â Á¤Àû ¸Þ¸ð¸® ÇÒ´çÀ» »ç¿ëÇÒ¼ö ¾øÀ¸¸ç,
¾î¿¼ö ¾øÀÌ µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ» »ç¿ëÇØ¾ß ÇÒ°ÍÀÌ´Ù.
</para>
<para>
"¾î¿¼ö ¾øÀÌ" ¶õ ¸»À» ºÙÀÎ ÀÌÀ¯´Â µÇµµ·ÏÀÌ¸é µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ»
»ç¿ëÇÏ´Â°Í º¸´Ù´Â Á¤Àû¸Þ¸ð¸® ÇÒ´çÀ» »ç¿ëÇÏ´Â°Ô ¿©·¯¸ð·Î ÀÌÀÍÀÌ
¸¹±â ¶§¹®ÀÌ´Ù.
</para>
<section>
<title>malloc, realloc, sizeof, memset, free</title>
<section>
<title>malloc</title>
<para>
µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ» À§Çؼ C ´Â ÁÖ¿äÇÑ ¸î°¡Áö ½Ã½ºÅÛ ÇÔ¼ö¿Í
Ű¿öµå¸¦ Á¦°øÇÑ´Ù. ÀÌÁß malloc ´Â ¸Þ¸ð¸® »ó¿¡¼ ¿¬¼ÓµÈ
ÀÏÁ¤ Å©±âÀÇ °ø°£À» ÇÒ´ç¹Þ±â À§Çؼ »ç¿ëÇÏ´Â °¡Àå
ÀϹÝÀûÀÎ ÇÔ¼öÀÌ´Ù.
<screen>
void *malloc(size_t number_of bytes);
</screen>
malloc() ÇÔ¼ö´Â ÀÎÀÚ·Î ÇÒ´ç¹Þ°íÀÚ ÇÏ´Â ¸Þ¸ð¸®ÀÇ Å©±â¸¦
byte ´ÜÀ§·Î ¸í½ÃÇÑ´Ù. ¸¸¾à ¸Þ¸ð¸® ÇÒ´çÀÌ ¼º°øÇß´Ù¸é malloc
ÇÔ¼ö´Â ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ ½ÃÀÛ À§Ä¡¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦
¹ÝȯÇÑ´Ù. (Æ÷ÀÎÅÍ¿¡ ´ëÇÑ ³»¿ëÀº <ulink url=modules.php?name=News&file=article&sid=87&mode=nested>µ¥ÀÌŸ¿Í Æ÷ÀÎÅÍ</ulink>)
void * ¸¦ ¹Þ´Â ÀÌÀ¯´Â void * ¸¦ ÀÌ¿ëÇÒ°æ¿ì
¾î¶² ŸÀÔÀ¸·Î¶óµµ
Çüº¯È¯ÀÌ °¡´ÉÇϱ⠶§¹®ÀÌ´Ù.
</para>
<para>
¸¸¾à 100 byte ÀÇ ¹®ÀÚ¸¦ ÀúÀåÇϱâ À§ÇÑ °ø°£À»
ÇÒ´ç¹Þ±â ¿øÇÑ´Ù¸é
´ÙÀ½°ú °°ÀÌ malloc() ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÉ°ÍÀÌ´Ù.
<screen>
char *cp;
cp = (char *)malloc(100);
</screen>
À§ÀÇ ¹æ¹ýÀ» ÅëÇØ¼ ¸Þ¸ð¸® ÇÒ´çÀ» ÇÏ°Ô µÈ´Ù¸é,
¸Þ¸ð¸®´Â ´ÙÀ½°ú °°ÀÌ ±¸¼ºµÇ°Ô µÉ°ÍÀÌ´Ù.
<screen>
0 1 2 3 0 .... 100
+-+-+-+-+ +-+-+-+-+-+-+-+-+-+
| cp | | |
+-+-+-+-+ +-+-+-+-+-+-+-+-+-+
| |
+----------------+
</screen>
malloc() À» ÅëÇØ¼ ¸Þ¸ð¸® ÇÒ´ç¿äûÀ» ¹ÞÀº ¿î¿µÃ¼Á¦(Ä¿³Î)Àº
100 byte Å©±â¸¸ÅÀÇ ¿¬¼ÓµÈ ¸Þ¸ð¸®¸¦ ÇÒ´çÇϰí,
ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ
ù¹øÂ°¸¦ °¡¸®Å°´Â ÁÖ¼Ò°ªÀ» ³Ñ°ÜÁØ´Ù.
¿ì¸®°¡ ½ÇÁ¦ *cp ¸¦°¡Áö°í
ÇÏ´Â ¿©·¯°¡Áö µ¥ÀÌŸ °ü·ÃµÈ Á¶ÀÛÀº ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ ÁÖ¼Ò°ªÀ»
ÀÌ¿ëÇØ¼ ÀÌ·ç¾îÁö°Ô µÈ´Ù.
</para>
<para>
¾Æ·¡ÀÇ ¿¹Á¦¸¦ ½ÇÇà½ÃÄѺ¸¸é Á»´õ ½±°Ô ÀÌÇØ°¡ °¡´ÉÇÒ°ÍÀÌ´Ù.
</para>
<para>
<emphasis>¿¹Á¦ : malloc_1.c</emphasis>
<screen>
#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);
}
</screen>
´ÙÀ½Àº À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ °á°úÀÌ´Ù.
°á°ú °ªÀº ¶§¿Í Àå¼Ò¿Í ½Ã½ºÅÛ¿¡ µû¶ó ´Þ¶óÁú¼ö ÀÖ´Ù.
(1, 2, 3, 4, ... ´Â ÇÊÀÚ°¡ ¼³¸íÀ» À§ÇØ ºÙÀÎ ¼ýÀÚÀÌ´Ù)
<screen>
[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
</screen>
1 ¹ø °á°ú´Â Æ÷ÀÎÅÍ *ch °¡ ÇÒ´çµÈ °÷ÀÇ ÁÖ¼Ò°ªÀÌ´Ù.
2 ¹ø °á°ú´Â *ch °¡ Æ÷ÀÎÅÍ(°¡¸®Å°´Â)ÇÏ´Â °÷ÀÇ Ã¹¹øÂ° ¸Þ¸ð¸®
ÀÇ ÁÖ¼Ò°ªÀÌ´Ù. *ch °¡ °¡¸®Å°´Â °÷Àº buf °¡ ÀúÀåµÈ ¸Þ¸ð¸®ÀÇ
ù¹øÂ° ÁÖ¼Ò °ªÀ̹ǷΠbffff7f0 ÀÌ ¼¼ÆÃµÇ¾ú´Ù. 3¹ø, 4¹ø °á°ú
´Â *ch °¡ ½ÇÁ¦ bufÀÇ ÁÖ¼Ò¸¦ °¡¸®Å°°í ÀÖÀ½À» È®ÀÎÇϱâ
À§ÇØ Ãâ·ÂÇÑ °ªÀÌ´Ù. ÀÌµé °á°ú¸¦ º¸¸é ½ÇÁ¦·Î Æ÷ÀÎÅͰ¡
¾î¶»°Ô °ªÀ» °¡¸®Å°°í ÀÖ´ÂÁö È®ÀÎÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù.
<screen>
0 1 2 3 0 .... 100
+-+-+-+-+ +-+-+-+-+-+-+-+-+-+
| ch | | buf |
+-+-+-+-+ +-+-+-+-+-+-+-+-+-+
bffff76c bffff7f0
| |
+-------------+
</screen>
</para>
<para>
5 ¹øºÎÅÍ 8 ¹ø±îÁö´Â malloc()À» È£ÃâÇÔÀ¸·Î½á ¸Þ¸ð¸®
±¸¼ºÀÌ ½ÇÁ¦·Î ¾î¶»°Ô µÇ´ÂÁö¸¦ º¸¿©ÁØ´Ù.
5 ¹øÀº cp °¡ À§Ä¡ÇÑ °÷ÀÇ ÁÖ¼ÒÀÌ´Ï±î º°·Î ½Å°æ¾µÇÊ¿ä´Â ¾ø´Ù.
6 ¹øÀº malloc() ÇϱâÀü¿¡ *cp °¡ °¡¸®Å°°í ÀÖ´Â °÷ÀÇ
ÁÖ¼Ò °ªÀ» º¸¿©Áִµ¥ ¸Þ¸ð¸® ÇÒ´çµÇ¾î ÀÖÁö¾ÊÀº°æ¿ìÀÌ´Ù.
À§ÀÇ °æ¿ì NULL À» °¡¸®Å°°í Àִµ¥, À̰ÍÀº »óȲ¿¡ µû¶ó º¯ÇÑ´Ù.
´Ù½Ã ¸»Çؼ ¸Þ¸ð¸® ÇÒ´çÇÏÁö ¾Ê¾ÒÀ»°æ¿ì ÀÓÀÇÀÇ ¿µ¿ªÀ» °¡¸®Å²´Ù°í
º¸¸é ¹«³ÇÏ´Ù.
7 ¹øÀÌ malloc()À» ÀÌ¿ëÇØ¼ ¸Þ¸ð¸®
ÇÒ´çÇÑÈÄ °¡¸®Å°´Â °÷ÀÇ ÁÖ¼ÒÀε¥, malloc() ÇϱâÀü°ú ºñ±³ÇØ
º¸¸é °¡¸®Å°°í ÀÖ´Â °÷ÀÇ ÁÖ¼Ò°¡ ¸íÈ®ÇÏ°Ô Á¤ÇØÁ® ÀÖÀ½À» È®ÀÎÇÒ¼ö ÀÖ´Ù.
8,9 ¹øÀº °¢°¢ buf ¿Í buf2 ¸¦ ´ëÀÔÇß´Ù.
<screen>
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
| |
+---------------------------------------+
</screen>
</para>
<section>
<title>¸Þ¸ð¸®¸¦ »ç¿ëÇϱâ À§Çؼ´Â ¹Ýµå½Ã ÇÒ´çÇØ¾ß ÇÑ´Ù.</title>
<para>
´ç¿¬ÇÑ ¾ê±âÀÌÁö¸¸ »ç¿ëÇϱâ À§Çؼ´Â Àû´çÇÑ °ø°£À»
ÇÒ´çÇØÁÖ¾î¾ß ÇÑ´Ù. ¹Ù·Î À§ÀÇ ±×¸²¿¡¼ malloc ÇϱâÀü¿¡
*cp °¡ °¡¸®Å°´Â ÁÖ¼Ò¸¦ º¸¸é »óȲ¿¡ µû¶ó ´Þ¶óÁø´Ù°í Çß´Ù.
±×·³À¸·Î ÇÒ´çµÇÁö ¾ÊÀº Æ÷ÀÎÅÍ¿¡ µ¥ÀÌŸ¸¦ ÀÔ·ÂÇϸé
ÀÓÀÇÀÇ ÁÖ¼Ò¿¡ ¾î¶² °ªÀ» ÀÔ·ÂÇÏ´Â ²ÃÀÌ µÈ´Ù.
¿îÀÌ ÁÁÀ¸¸é ÀÓÀÇÀÇ ÁÖ¼Ò ¿µ¿ª¿¡ µ¥ÀÌŸ¸¦ ÃæºÐÈ÷ ÀúÀåÇÒ °ø°£ÀÌ
È®º¸µÇ¾î ÀÖ¾î¼ ¿¡·¯¾øÀÌ ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ¼öµµ ÀÖÁö¸¸,
´Ù¸¥ ÇÁ·Î¼¼½º°¡ Â÷ÁöÇϰí ÀÖ´Â ¸Þ¸ð¸® ¿µ¿ªÀ» ħ¹üÇÒ¼öµµ ÀÖ´Ù.
ÀÌ·²°æ¿ì ¸Þ¸ð¸® ¿µ¿ª¿¡ ´ëÇÑ
¿ì¼±±ÇÀº ¸ÕÀú ȹµæÇÑ ÇÁ·Î¼¼½º¿¡°Ô ÀÖÀ½À¸·Î, Ä¿³ÎÀº
ÀÌ ¸Þ¸ð¸®¿µ¿ª¿¡ µ¥ÀÌŸ¸¦ ¾²·Á°í ÇÏ´Â ÇÁ·Î¼¼½º¸¦
°Á¦ Á¾·á½Ãų°ÍÀÌ´Ù(¼¼±×¸ÕÆ® ÆúÆ® ¿¡·¯)
</para>
<para>
À§¿¡¼ ¸Þ¸ð¸® ÇÒ´çÀ» ÇÏÁö ¾Ê¾ÒÀ½¿¡µµ ºÒ±¸Çϰí
ÇÁ·Î±×·¥ÀÌ Á¦´ë·Î ½ÇÇàµÇ¸é ¿îÀÌ ÁÁÀº°æ¿ì¶ó°í Çߴµ¥,
»ç½Ç À̰æ¿ì´Â ¿îÀÌ ÁÁÀº°æ¿ì°¡ ¾Æ´Ï°í
¿îÀÌ ³ª»Û°æ¿ì°¡ µÈ´Ù. ¾ð¶æ º¸±â¿¡ Á¤»óÀûÀ¸·Î
½ÇÇàµÇ´Â°Í ó·³ º¸Àϼö Àֱ⠶§¹®¿¡ µð¹ö±ë ÀÛ¾÷À»
¾î·Æ°Ô ¸¸µé¼ö Àֱ⠶§¹®ÀÌ´Ù(´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ¸Þ¸ð¸® ¿µ¿ªÀ»
ħ¹üÇÒ °¡´É¼ºÀ» °¡Áö°í ÀÖ´Â ºÒ¿ÏÀüÇÑ ÄÚµåÀÌ´Ù).
Àß µ¹´Ù°¡ ¾î´À³¯ ¾ÆÄ§¿¡ È®ÀÎÇØº¸´Ï±î ÇÁ·Î±×·¥ÀÌ
Á×´Â °æ¿ì°¡ µÉ È®·üÀÌ ³ô´Ù. »ç¿ëÇÏ´Â ¸Þ¸ð¸®ÀÇ
°ø°£ÀÌ ÀÛÀ»¼ö·Ï(Å©¸éÀº ´Ù¸¥ ¿µ¿ªÀ» ħ¹üÇÒ °¡´É¼ºÀÌ
Å©´Ù) ¿î ÁÁ°Ô(³ª»Ú°Ô) Á¦´ë·Î ÀÛµ¿µÉ È®·üÀÌ Å©´Ù.
</para>
<para>
±×·¯¹Ç·Î ¾Æ·¡¿Í °°Àº ÄÚµå´Â ½É°¢ÇÏ°Ô À߸øµÈ
ÄÚµåÀÌ´Ù.(¾Æ¸¶ ¾î¶²°æ¿ì¿¡´Â Á¦´ë·Î ½ÇÇàµÇ°í,
¾î¶² °æ¿ì¿¡´Â ¼¼±×¸ÕÆ® ÆúÆ®°¡ ¶³¾îÁú°ÍÀÌ´Ù)
<screen>
char *cp;
memcpy(cp, "1234", 100);
</screen>
À§ÀÇ ÄÚµå´Â ¾Æ·¡¿Í °°ÀÌ ¹Ì¸® °ø°£À» ÇÒ´çÇÑÈÄ
»ç¿ëÇϵµ·Ï Á¦ÀÛ¼º ÇØ¾ß ÇÑ´Ù.
<screen>
char *cp;
cp = (char *)malloc(100);
memcpy(cp, "1234", 100);
</screen>
</para>
</section>
</section>
<section>
<title>realloc</title>
<para>
¸Þ¸ð¸®ÀÇ Å©±â¸¦ Á¶Á¤ÇϰíÀÚ ÇÒ¶§ »ç¿ëÇÑ´Ù.
¿¡µðÅÍ ÇÁ·Î±×·¥À» ¿¹·Î µé¾îº¸ÀÚ¸é, 2°¡Áö ¸Þ¸ð¸® ÇÒ´çÀ»
ÇÒ¼ö ÀÖÀ»°Çµ¥, ÆÄÀÏÀÇ Å©±â¸¦ ÀÐÀº´ÙÀ½ ÆÄÀÏÀÇ Å©±â¸¸Å
Çѹø¿¡ ¸Þ¸ð¸® ÇÒ´çÀ» ÇØ¹ö¸®´Â ¹æ¹ý°ú 1024 ¹ÙÀÌÆ® Á¤µµ·Î
ÇÒ´çÇϰí, ÆÄÀÏÀ» ÀоîµéÀÌ´Ù°¡ 1024 ¸¦ ÃʰúÇÏ°Ô µÇ¸é,
realloc ¸¦ ÀÌ¿ëÇØ¼ 1024¸¦ ´õ ÇÒ´çÇØÁÖ´Â ¹æ¹ýÀÌ ÀÖ´Ù.
</para>
<para>
¾î´À°É »ç¿ëÇϵçÁö °ü°è´Â ¾øÁö¸¸, realloc Àº ±âº»ÇൿÀÌ
¸¸¾à ¿¬¼ÓµÈ ¸Þ¸ð¸® °ø°£ÀÌ ÃæºÐÇÏÁö ¾ÊÀ»°æ¿ì
¿¬¼ÓµÈ ¸Þ¸ð¸® °ø°£À» ÇÒ´çÇÒ¼ö ÀÖµµ·Ï »õ·Î °ø°£À» Àâ°Ô
µÇ¸ç, ÀÌ¿ÍÁß¿¡ ±âÁ¸ÀÇ µ¥ÀÌŸ°¡ º¹»çµÇ¹Ç·Î »ó´çÈ÷
¸¹Àº ºñ¿ëÀÌ ¼Ò¸ðµÉ¼ö ÀÖ´Ù.(½ÇÁ¦ Å×½ºÆ® ÇØº¸¸é ¾Ë°ÚÁö¸¸
malloc ¿¡ ºñÇØ¼ ´«¿¡ ¶ç°Ô ¸¹Àº ½Ã°£ÀÌ ¼Ò¸ðµÈ´Ù)
</para>
<para>
<emphasis>¿¹Á¦ : realloc.c</emphasis>
<screen>
#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);
}
</screen>
´ÙÀ½Àº À§ÀÇ ¿¹Á¦¸¦ ½ÇÇà½ÃŲ °á°úÀÌ´Ù.
<screen>
[root@localhost doc]# ./realloc
100 : 8049770
10000 : 8049770
1000000 : 4015e008
Value is (111)
</screen>
À§ÀÇ °ªÀº »óȲ¿¡ µû¶ó º¯ÇÒ¼ö ÀÖ´Ù. 100, 10000 Àº
°°Àº ¸Þ¸ð¸® ÁÖ¼Ò¸¦ »ç¿ëÇϰí ÀÖÁö¸¸, 1000000 ÀÌ µÇ¸é¼
¸Þ¸ð¸®ÀÇ À§Ä¡°¡ º¯°æµÇ¾úÀ½À» ¾Ë¼ö ÀÖ´Ù. ¾Æ¹«·¡µµ 100 °ú
10000 ÀÇ °æ¿ì ±×¸® Å«Â÷À̰¡ ³ªÁö ¾Ê±â ¶§¹®¿¡ ÇöÀç
À§Ä¡¿¡¼ ¿¬¼ÓµÈ ¸Þ¸ð¸® °ø°£À» È®º¸ÇϱⰡ ¼ö¿ùÇÏÁö¸¸
°ªÀÌ Ä¿Áú¼ö·Ï ¿¬¼ÓµÈ ¸Þ¸ð¸® °ø°£À» È®º¸°¡ ¾î·Á¿öÁö±â
¶§¹®¿¡, ¾î¿¼ö ¾øÀÌ ¸Þ¸ð¸® À̵¿ÀÌ ÀϾ°Ô µÈ´Ù.
¸Þ¸ð¸® À§Ä¡ À̵¿ÀÌ ÀϾ٠ÇÏ´õ¶óµµ °ªÀº ±×´ë·Î º¹»çµÇ°í
ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù.
</para>
</section>
<section>
<title>sizeof</title>
<para>
sizeof ´Â C ¿¡¼ Á¦°øÇϴ Ű¿öµå·Î ÇØ´ç ÀÚ·áÇüÀÇ Å©±â¸¦
µ¹·ÁÁØ´Ù. sizeof ´Â ¸Þ¸ð¸® ÇÒ´ç¿¡ ÀÖ¾î¼ ²Ï Áß¿äÇÑ ¿ªÇÒÀ»
°¡Áø´Ù. ÀÌÀ¯´Â °¢ ÀÚ·áÇü¸¶´Ù Â÷ÁöÇÏ´Â byte Å©±â°¡ Ʋ¸®°í,
°°Àº ÀÚ·áÇüÀ̶ó ÇÒÁö¶óµµ ¿î¿µÃ¼Á¦¿¡ µû¶ó ±× Å©±â°¡
´Þ¶óÁú¼ö Àֱ⠶§¹®ÀÌ´Ù. ¿¹¸¦µé¾î int Çü ÀÚ·á 4°³¸¦
ÀúÀåÇϱâ À§Çؼ ´ÙÀ½°ú °°ÀÌ
¸Þ¸ð¸® Å©±â¸¦ ÇÒ´çÇß´Ù°í ÇÏÀÚ.
<screen>
int *ip;
ip = (int *)malloc(16);
</screen>
int ÇüÀº º¸ÅëÀÇ °æ¿ì 4byte À̴ϱî
4°³ÀÇ ÀڷḦ ÀúÀåÇϱâ À§Çؼ
´Â 16 ¸¸ÅÀÇ Å©±â°¡ ÇÊ¿äÇÑ°Ç È®½ÇÇÏ´Ù.
±×·¯³ª int ÇüÀÇ Å©±â°¡
4byte ÀΰÍÀº º¸ÅëÀÇ °æ¿ìÀ̰í 2byte ȤÀº 8byte ÀÎ °æ¿ì°¡
ÀÖÀ»¼öµµ ÀÖ´Ù. ±×·²°æ¿ì À§ÀÇ ÇÁ·Î±×·¥Àº ÇöÀç ¿î¿µÃ¼Á¦¿¡¼´Â
¹®Á¦ ¾ø°ÚÁö¸¸, ´Ù¸¥ ¿î¿µÃ¼Á¦·Î Æ÷ÆÃÇϰíÀÚ
ÇÒ¶§ ¹®Á¦°¡ µÉ¼öµµ ÀÖ´Ù.
</para>
<para>
ÀÌ·± ¹®Á¦¸¦ ¾ø¾Ö±â À§Çؼ sizeof Ű¿öµå¸¦ Á¦°ø¹Þ¾Æ¼
»ç¿ëÇÑ´Ù. ÀÌ Å°¿öµå¸¦ »ç¿ëÇÏ¸é ¿î¿µÃ¼Á¦¿¡¼
»ç¿ëÇÏ´Â ÀÚ·áÇüÀÇ Å©±â¸¦ µ¹·ÁÁÖ°Ô
µÊÀ¸·Î À§¿¡¼¿Í °°Àº ¹®Á¦Á¡ÀÌ
¹ß»ýÇÏÁö ¾Ê´Â´Ù.
<screen>
int *ip;
ip = (int *)malloc(sizeof(int)*4);
printf("int size is %d\n", sizeof(int));
</screen>
int ÀÚ·áÇüÀ» À§Çؼ 4byte °ø°£À» ÇÊ¿ä·Î ÇÏ´Â ¿î¿µÃ¼Á¦¶ó¸é
16, 8byte ¸¸ÅÀ» ÇÊ¿ä·Î ÇÏ´Â ¿î¿µÃ¼Á¦¶ó¸é 32byte ¸¸ÅÀ»
ÇÒ´ç¹ÞÀ»¼ö ÀÖ°Ô µÉ°ÍÀÌ´Ù.
</para>
</section>
<section>
<title>free</title>
<para>
malloc() Àº ¸Þ¸ð¸® ÇÒ´çÀ» Ä¿³Î¿¡ ¿äûÇÏ´Â ½Ã½ºÅÛ ÇÔ¼öÀÌ´Ù.
±×·¯¹Ç·Î ÀÏ´Ü malloc()¿¡ ÀÇÇØ¼ ÇÒ´ç¹ÞÀº ¸Þ¸ð¸®´Â
ÇÁ·Î¼¼½º°¡ Á¾·áµÉ¶§±îÁö Ä¿³Î¿¡ ÀÇÇØ¼ º¸È£¹Þ°Ô µÈ´Ù.
</para>
<para>
À̸»Àº malloc() ¸¦ À߸ø »ç¿ëÇÒ°æ¿ì ¾µµ¥¾ø´Â
¸Þ¸ð¸® °ø°£ÀÇ ³¶ºñ
¸¦ °¡Á® ¿Ã¼ö ÀÖÀ¸¸ç, ½É°¢ÇÒ°æ¿ì ¸Þ¸ð¸® ´©¼ö¸¦ °¡Á®¿Ã¼ö
ÀÖ´Ù´Â ¶æÀ̵ȴÙ. ´ÙÀ½ÀÇ ¿¹¸¦ º¸ÀÚ
</para>
<para>
<emphasis>warn_mem.c</emphasis>
<screen>
#include <unistd.h>
int main()
{
char *cp;
while(1)
{
cp = (char *)malloc(10000);
printf("%x\n", cp);
sleep(1);
}
}
</screen>
À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄѺ¸¸é, ¿î¿µÃ¼Á¦¿¡¼ °è¼ÓÀûÀ¸·Î
100byte Å©±âÀÇ »õ·Î¿î ¸Þ¸ð¸® °ø°£À» ÇÁ·Î¼¼½º¿¡°Ô ÇÒ´çÇØ
Áִ°ÍÀ» º¼¼ö ÀÖ´Ù.
<screen>
[root@localhost doc]# ./warn_mem
8049690
8061d38
807a3e0
8092a88
80ab130
80c37d8
</screen>
½ÇÁ¦ warn_mem ÀÇ ½ÇÇà°á°ú ¸Þ¸ð¸® ´©¼ö°¡ »ý±â´ÂÁö
È®ÀÎÀ» À§Çؼ °£´ÜÇÑ ½ºÅ©¸³Æ®¸¦ ¸¸µé¾î¼ Å×½ºÆ®¸¦ ÇØº¸µµ·Ï
ÇÏÀÚ.
<screen>
[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
</screen>
ps ÀÇ Çì´õ ºÎºÐÀº ¿ø·¡ ½ºÅ©¸³Æ®ÀÇ ½ÇÇà°á°ú¿¡´Â Ç¥½ÃµÇÁö
¾ÊÁö¸¸ ps °á°úÀÇ ÇÊµå ±¸ºÐÀ» ½±°Ô Çϱâ À§Çؼ Ãß°¡ ½ÃÄ×´Ù.
À§ÀÇ °á°ú¸¦ º¸¸é warn_mem ÇÁ·Î¼¼½º¿¡¼ Á¡À¯ÇÏ´Â ¸Þ¸ð¸®ÀÇ
Å©±â°¡ Áö¼ÓÀûÀ¸·Î Áõ°¡µÇ°í ÀÖÀ½À» º¼¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ¸Þ¸ð¸®
´©¼ö´Â ÇÁ·Î±×·¥¿¡¼ ¸Å¿ì Ä¡¸íÀûÀϼö ÀÖ´Ù.
ƯÈ÷ ÀÌ·¯ÇÑ Á¾·ùÀÇ
¹®Á¦´Â ÄÄÆÄÀÏ·¯¿¡¼ 󸮸¦ ÇØÁÖÁö ¾Ê±â ¶§¹®¿¡ ³ªÁß¿¡
¹®Á¦Á¡À» ã±â°¡ ¸Å¿ì °ï¶õÇØÁø´Ù. ÈçÈ÷ ¸»ÇÏ´Â ¸îÀÏ Àßµ¹´Ù°¡
Á×´Â ÇÁ·Î±×·¥ÀÌ µÉ °¡¸Á¼ºÀÌ Å©´Ù.
</para>
<para>
±×·¯¹Ç·Î »ç¿ëÇÏÁö ¾Ê´Â ¸Þ¸ð¸®°ø°£Àº ¹Ýµå½Ã ¿î¿µÃ¼Á¦¿¡°Ô
µÇµ¹·Á ÁÖ¾î¾ß ÇÑ´Ù. C ´Â µ¿ÀûÀ¸·Î ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ ÇØÁ¦¸¦
À§Çؼ free() ¸¦ Á¦°øÇÑ´Ù.
´ÙÀ½Àº warn_mem.c ÀÇ ¸Þ¸ð¸® ´©¼ö ¹®Á¦¸¦ free() ¸¦ ÅëÇØ¼
ÇØ°áÇÑ ÄÚµåÀÌ´Ù.
</para>
<para>
<emphasis>free_mem.c</emphasis>
<screen>
#include <unistd.h>
int main()
{
char *cp;
while(1)
{
cp = (char *)malloc(100000);
printf("%x\n", &(*cp));
sleep(1);
free(cp);
}
}
</screen>
À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇà½Ã۰í, Å×½ºÆ®¸¦ ÇØº¸¸é ±âÁ¸¿¡
ÀÖ´ø ¸Þ¸ð¸® ´©¼ö Çö»óÀÌ »ç¶óÁ³À½À» È®ÀÎÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù.
</para>
</section>
</section>
</section>
</section>
<section>
<title>µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀÇ ÀÀ¿ë</title>
<para>
À̹øÀå¿¡¼´Â µ¿Àû¸Þ¸ð¸® ÇÒ´çÀÇ ÀÀ¿ë ¿¹Á¦¸¦ ¸¸µé¾î º¼°ÍÀÌ´Ù.
¸¸µé ÀÀ¿ë ¿¹Á¦´Â linked list ÀÌ´Ù.
</para>
<section>
<title>¸µÅ©µå ¸®½ºÆ® ¿¡ ´ëÇØ¼</title>
<para>
¸µÅ©µå ¸®½ºÆ®´Â ±×¸® °£´ÜÈ÷ ´Ù·ê¼ö ÀÖ´Â ÁÖÁ¦°¡ ¾Æ´Ï´Ù.
¸µÅ©µå ¸®½ºÆ®¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº ÀڷᱸÁ¶¸¦ ´Ù·ê ±âȸ°¡ ÀÖÀ¸¸é
±×¶§ Çϱâ·Î Çϰí, ¿©±â¿¡¼´Â °³³äÁ¤µµ¸¸ ¼³¸íÇϵµ·Ï ÇϰڴÙ.
</para>
<para>
¸µÅ©µå ¸®½ºÆ®´Â ¸»±×´ë·Î ¸®½ºÆ®¸¦ ¸¸µé±â À§Çؼ »ç¿ëµÇ´Â
ÀڷᱸÁ¶ÀÌ´Ù. ¸®½ºÆ®¸¦ ¸¸µé±â À§Çؼ´Â ÀÚ·áÀÇ ¿¬¼ÓµÈ ¼ø¼¸¦
¸¸µé¾î Áà¾ß ÇÑ´Ù. ±×·²·Á¸é ´ÙÀ½ÀÚ·áÀÇ Á¤º¸°¡ ¹«¾ùÀÎÁö¸¦
¾Ë¾Æ¾ß Çϴµ¥, ¸µÅ©µå ¸®½ºÆ®¶õ ´ÙÀ½ÀÚ·áÀÇ Á¤º¸°¡ ¹«¾ùÀÎÁö¸¦
¾Ë°í ÀÖ´Â ±¸Á¶¸¦ ¸»ÇÑ´Ù. ¿©±â¼ ´ÙÀ½ÀÚ·áÀÇ Á¤º¸¶õ ´ÙÀ½ ÀÚ·á°¡
À§Ä¡Çϰí ÀÖ´Â ÁÖ¼ÒÀÇ °ªÀÌ µÉ°ÍÀÌ´Ù.
<screen>
P: Pointer
+--------++-+ +--------++-+ +--------++-+
| Data 1 ||P| | Data 2 ||P| | Data 3 ||P|
+--------++-+ +--------++-+ +--------++-+
| | | |
+-----+ +-----+
</screen>
´ëÃæ À§¿Í °°Àº ¹æ½ÄÀ¸·Î ¿¬°áµÈ´Ù. ¸®½ºÆ®¸¦ ÀÌ·ç°í ÀÖ´Â
¸®½ºÆ® ¸â¹öµéÀº ½ÇÁ¦ Data ¿Í ´õºÒ¾î ´ÙÀ½ µ¥ÀÌŸÀÇ ÁÖ¼ÒÁ¤º¸¸¦
°¡Áö°í ÀÖ´Â Pointer À» °¡Áö°í ÀÖÀ¸¸ç, ÇÁ·Î±×·¡¸Ó´Â ÀÌ
Pointer Á¤º¸¸¦ ÀÌ¿ëÇØ¼, µ¥ÀÌŸ¿¡ Á¢±ÙÇÒ¼ö ÀÖ°Ô µÈ´Ù.
À§ÀÇ ±×¸²À» º¸¸é ¾Ë°ÚÁö¸¸ Data 3 ¿¡ Á¢±ÙÇϱâ À§Çؼ´Â
Data 1 ¹øºÎÅÍ ¼øÂ÷ÀûÀ¸·Î Á¢±ÙÇØ¾ß ÇÑ´Ù´Â °ÍÀ» ¾Ë¼ö ÀÖ´Ù.
</para>
</section>
<section>
<title>µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ» ÅëÇÑ ¸µÅ©µå ¸®½ºÆ®ÀÇ ±¸Çö</title>
<para>
À§¿¡¼ ¸»ÇßÁö¸¸ ÀڷᱸÁ¶ ÀÚüÀÇ ¼³¸íÀ» ¸ñÀûÀÌ ¾Æ´Ñ °ü°è·Î
°¡Àå ´Ü¼øÇÑ ÇüÅÂÀÇ ¸µÅ©µå ¸®½ºÆ®¸¦ ±¸ÇöÇϵµ·Ï ÇϰڴÙ.
ÀÌ ¸µÅ©µå ¸®½ºÆ®´Â ´ÙÀ½°ú °°Àº ±â´ÉÀ» °¡Áø´Ù.
<variablelist>
<varlistentry>
<term>µ¥ÀÌŸ »ðÀÔ</term>
<listitem>
<para>
¸â¹ö µ¥ÀÌŸ¸¦ »ðÀÔÇÑ´Ù. ÃÖÃÊ µ¥ÀÌŸ°¡ »ðÀԵɶ§´Â
´ÙÀ½ µ¥ÀÌŸ°¡ ¾øÀ½À¸·Î ´ÙÀ½µ¥ÀÌŸ¸¦ °¡¸®Å°´Â
Pointer Àº NULL ÀÌ µÉ°ÍÀÌ´Ù. ¸¸¾à µÎ¹øÂ° µ¥ÀÌŸ°¡
µé¾î¿Â´Ù¸é ù¹øÂ° µ¥ÀÌŸÀÇ Pointer Àº µÎ¹øÂ°
µ¥ÀÌŸÀÇ À§Ä¡¸¦ °¡¸®Å°°Ô µÉ°ÍÀÌ´Ù.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>µ¥ÀÌŸ »èÁ¦</title>
<listitem>
<para>
µ¥ÀÌŸ »èÁ¦¸¦ Á¦´ë·Î ±¸ÇöÇϰíÀÚ ÇÑ´Ù¸é, ã±âÈÄ
»èÁ¦¸¦ ±¸ÇöÇØ¾ß ÇϰÚÀ¸³ª ¿©±â¿¡¼´Â POP ½ºÅ¸ÀÏÀÇ
»èÁ¦¸¦ ±¸ÇöÇϵµ·Ï ÇÑ´Ù.(°¡Àå ¸ÕÀú µé¾î¿Â µ¥ÀÌŸ°¡
°¡Àå ¸ÕÀú »èÁ¦µÇ´Â ¹æ½Ä)
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>µ¥ÀÌŸ Ãâ·Â</title>
<listitem>
<para>
¿ª½Ã °£´ÜÇÏ°Ô Ã³À½ÀÇ ¸®½ºÆ® ¸â¹öºÎÅÍ ¼øÂ÷ÀûÀ¸·Î
°Ë»öÇØ°¡¸é¼ µ¥ÀÌŸ¸¦ Ãâ·ÂÇÏ´Â ¹æ½ÄÀ¸·Î ±¸ÇöÇÒ
°ÍÀÌ´Ù.
</para>
</listitem>
</varlistentry>
</variablelist>
À§ÀÇ 3°¡Áö ±¸ÇöÀº ¸µÅ©µå ¸®½ºÆ® »Ó¸¸ ¾Æ´Ï¶ó ´Ù¸¥ ÀڷᱸÁ¶¿¡¼µµ
°¡Àå ±âº»ÀÌ µÇ´Â°ÍµéÀ̸ç À§ÀÇ ±¸Çö¹æ½ÄÀÇ ¾à°£ ´Ù¸¥ ÀÀ¿ëÀ¸·Î
¸¸µé¾îÁø´Ù. Á»´õ ³À̵µ ÀÖ´Â ±¸ÇöÀº °¢ÀÚ °øºÎ»ï¾Æ¼ ÇØº¸±â
¹Ù¶õ´Ù.
</para>
</section>
<section>
<title>¿¹Á¦</title>
<para>
<emphasis>linked_list.c</emphasis>
<screen>
#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;
}
}
</screen>
</para>
<para>
´ÙÀ½Àº ÇÊÀÚÀÇ ÄÄÇ»ÅÍ¿¡¼ ½ÇÇà½ÃŲ °á°ú´Ù. ¹øÈ£´Â ¼³¸íÀ» À§Çؼ
ºÙÀΰÍÀÌ´Ù.
<screen>
[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
</screen>
2°³ÀÇ ÁÖ¼Ò°ªÀÌ Ãâ·ÂµÇ´Âµ¥, ù¹øÂ° ÁÖ¼Ò°ªÀº ÀÚ½ÅÀÇ ÁÖ¼Ò°ªÀ̰í
2¹øÂ° ÁÖ¼Ò°ªÀº ´ÙÀ½ °¡¸®Å°´Â µ¥ÀÌŸÀÇ ÁÖ¼Ò°ªÀÌ´Ù. º¸¸é
1 -> 2 -> 3 -> 4 ÀÇ ½ÄÀ¸·Î µ¥ÀÌŸ¸¦ °¡¸®Å°°í ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù.
</para>
</section>
</section>
</article>
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|