๋ผ์ธ 2: char *p1;
p1 = malloc( 10 );
p1 = "1234567890";
๋ผ์ธ1๋ก ํ์๋์ ๋ผ์ธ2๋ก ํ์๋์ ์ฐจ์ด์ ์ด ๋ฌด์์ ๋๊น?
๊ฒฝํ์ ๋ณด๋ฉด ๋ผ์ธ 1๊ณผ ๊ฐ์ด ํ๋ ๊ฒฝ์ฐ๋ p1 ๋ณ์์ ๋ค์ด๊ฐ ๊ฐ์ด
์์ ๊ฒฝ์ฐ์ด๋ฉฐ..๋ง์ผ ํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋๋ฐ ์ฌ์ฉํ ๋ณ์์ธ๋ฐ malloc์ ์ฌ์ฉํ์ง
์์ผ๋ฉด ํฌ์ธํฐ ์๋ฌ๊ฐ ๋๋๊ตฐ์.. ๊ทธ๋์ ํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด
malloc์ ์ฌ์ฉํด์ผ ํ๋๊ตฐ์..
๊ทธ๋์ ์ ๋ ๊ทธ๋ ๊ฒ ์๊ฐํ์ต๋๋ค. "๋ผ์ธ 1๊ณผ ๊ฐ์ด ํ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ
์ผ์ ํ ํฌ๊ธฐ์ ์์ญ์ ์๋์ผ๋ก ์ก๊ธฐ๋๋ฌธ์ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ๋๋ ๋ผ์ธ 1๊ณผ ๊ฐ์ด
์ฌ์ฉํ๊ณ , ๋ฃ์ ๊ฐ์ด ํฐ๊ฒฝ์ฐ๋ ๋ฐ๋์ malloc์ ์ฌ์ฉํด์ผํ๋ค" <-- ์ด๋ง์ด
๋ง์ต๋๊น?
๋ง๋ค๋ฉด? ๋๋์ฒด ์ด๋์ ๋ ํฌ๊ธฐ๊น์ง๊ฐ malloc์ผ๋ก ์ก์ ํ์๊ฐ ์๋๊ฑด๊ฐ์?
(๋ณดํต ๋ผ์ธ1๊ณผ ๊ฐ์ด ํ ๊ฒฝ์ฐ ๋ง๋ก์ผ๋ก ์์ก๊ณ ๋ผ์ธ1๊ณผ๊ฐ์ด ๊ทธ๋ฅ ๋ฃ๊ณ printf
ํ์์์..)
----------------------------------------------------------------------------
์ง๋ฌธ2
๋ผ์ธ 1: char p1[10];
๋ผ์ธ 2: char *p1;
p1 = malloc(10);
๋ผ์ธ 1๊ณผ ๋ผ์ธ 2๋ ๊ฐ์ ๋ง์ด์ฃ ? ๊ทธ๋ผ
๋ผ์ธ 3: char p2[];
๋ผ์ธ 4: char *p2;
๋ผ์ธ 3๊ณผ ๋ผ์ธ 4๋ ๊ฐ์ ๋ง์ธ๊ฐ์?
----------------------------------------------------------------------------
์ง๋ฌธ3
๋ค์๊ณผ ๊ฐ์ ์์ค๊ฐ ์์ต๋๋ค. (์ ์ฒด์ฝ๋๋ ์๋๊ณ ํ์ํ ๋ถ๋ถ๋ง ๋ฃ์์ต๋๋ค.)
file://source start..
struct str_var
{
char *name;
char *value;
};
struct varentry vartable[1024];
void insert_value( const char *name, const char *val )
{
char *nptr, *vptr;
int i;
nptr = (char *) malloc( strlen(name)+1); <---- ์ด ๋ถ๋ถ๊ณผ
vptr = (char *) malloc( strlen(val)+1); <---- ์ด ๋ถ๋ถ์ ํ์๊ฐ ์๋๊ฑฐ
์๋๊ฐ์?
strcpy( nptr, name );
strcpy( vptr, val );
for( i=0 ; i<1024 ; i++ )
{
if( vartable[i].name == NULL )
{
vartable[i].name = nptr;
vartable[i].val = vptr;
break;
}
}
}
int main( void )
{
querystr = (char *) malloc( size );
valuestr = (char *) malloc( size );
querystr์ ๊ฐ ์ง์ด๋ฃ๋ ์ฝ๋;
valuestr์ ๊ฐ ์ง์ด๋ฃ๋ ์ฝ๋;
insert_value( querystr, valuestr );
}
file://source end.
-------
nptr = (char *) malloc( strlen(name)+1); <---- ์ด ๋ถ๋ถ๊ณผ
vptr = (char *) malloc( strlen(val)+1); <---- ์ด ๋ถ๋ถ์ ํ์๊ฐ ์๋๊ฑฐ
์๋๊ฐ์?
insert_value์ ๋์ด๊ฐ๋ ๊ฐ(querystr, valuestr)์ malloc์ผ๋ก ๋ฒ์๋ฅผ
์ก์์ต๋๋ค.
๊ทธ๋ฆฌ๊ตฌ๋์ insert_value์์ call by value๋ก name๊ณผ val์ ์ฃผ์๋ฅผ ๋ฃ์ฃ ?
์ฆ, name๊ณผ val์ด ๊ฐ๋ฆฌํค๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ์กํ์๋ ์ด๋ค์ฃผ์ ์์ญ์
๊ฐ๋ฆฌํค๊ณ ์๊ฒ ์ฃ ?
๊ทธ๋ฌ๋ฏ๋ก char *nptr, *vptr์ ์๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ์์ strcpy๋ก ๋ณต์ฌํ๋ค์
vartable[i].name, vartable[i].val์ ๋ฃ๋ ๋์์ ํ ํ์์์ด..
๊ทธ๋ฅ vartable[i].name = name; vartable[i].val = val; ์ด๋ ๊ฒ ํ๋ฉด ๋๋๊ฑฐ
์๋๊ฐ์ฌ?
๋งค๊ฐ๋ณ์๋ก ๋์ด์จ name๊ณผ val์ ์ด๋ฏธ ์์ญ์ด ์กํ์๋ ์์ ํ ํฌ์ธํฐ ์๋๋๊น?
๊ทธ๋ฐ๋ฐ ์ ๊ทธ๋ ๊ฒ ๋ malloc์ ์ก๊ณ ์ ๋ ๊ฒ ํ์ฃ ?
ํน์ ๋์ค์ ๋ค๋ฅธ ๊ณณ์์ ์ฐ์ผ๊ฒ ์ ์ํด ํจ์๋ฅผ ๊ฒฌ๊ณ ํ๊ฒ ๋ง๋๋๋๊ณ ์ ๋ ๊ฒ
ํ๊ฑด๊ฐ์?
์๋๋ฉด ๋ค๋ฅธ ์๋ฏธ๊ฐ ์๋๊ฑด๊ฐ์?
=================================================================
ํํ.. ์ ์ง๋ฌธ์ ์ดํดํ์ จ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.. ^^;;
๊ทธ๋ผ ๋ต๋ณ ๋ถํ๋๋ฆฝ๋๋ค.
> ์ง๋ฌธ1
> --------------------------------------------------------------------------
--
> ๋ผ์ธ 1: char *p1 = "1234567890";
>
> ๋ผ์ธ 2: char *p1;
> p1 = malloc( 10 );
> p1 = "1234567890";
>
[ ์ง๋ฌธ1]
unix, linux- gcc or g++, turbo c ์๋ฌด๋ฐ์๋ compileํด๋ ๊ฐ์ต๋๋ค. ์๋ฌ๊ฐ
๋์ง ์๋ ๊ฒ์ด ์ ์์
๋๋ค. ํ๋ referencing์ ํ๊ธฐ์ํด์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ก์์ฃผ๋
๊ฒ์ด ๋ฐ๋์งํ๋ต๋๋ค.
> --------------------------------------------------------------------------
--
> ์ง๋ฌธ2
>
> ๋ผ์ธ 1: char p1[10];
> ๋ผ์ธ 2: char *p1;
> p1 = malloc(10);
>
> ๋ผ์ธ 1๊ณผ ๋ผ์ธ 2๋ ๊ฐ์ ๋ง์ด์ฃ ? ๊ทธ๋ผ
>
> ๋ผ์ธ 3: char p2[];
> ๋ผ์ธ 4: char *p2;
>
> ๋ผ์ธ 3๊ณผ ๋ผ์ธ 4๋ ๊ฐ์ ๋ง์ธ๊ฐ์?
[์ง๋ฌธ2]
์ ํํ ๊ฐ์ notation์
๋๋ค. ์ฆ *p2๋ p2[]๋ชจ๋ array์ ์ฒซ๋ฒ์งธ ์์ ๋ฒ์ง์๋ฅผ
๋ํ๋
๋๋ค. Base๋๋๋ค.
> --------------------------------------------------------------------------
--
> ์ง๋ฌธ3
>
> ๋ค์๊ณผ ๊ฐ์ ์์ค๊ฐ ์์ต๋๋ค. (์ ์ฒด์ฝ๋๋ ์๋๊ณ ํ์ํ ๋ถ๋ถ๋ง ๋ฃ์์ต๋๋ค.)
>
> struct str_var
> {
> char *name;
> char *value;
> };
>
> struct varentry vartable[1024];
>
> void insert_value( const char *name, const char *val )
> {
> char *nptr, *vptr;
> int i;
>
> nptr = (char *) malloc( strlen(name)+1); <---- ์ด ๋ถ๋ถ๊ณผ
> vptr = (char *) malloc( strlen(val)+1); <---- ์ด ๋ถ๋ถ์ ํ์๊ฐ
์๋๊ฑฐ
>
> nptr = (char *) malloc( strlen(name)+1); <---- ์ด ๋ถ๋ถ๊ณผ
> vptr = (char *) malloc( strlen(val)+1); <---- ์ด ๋ถ๋ถ์ ํ์๊ฐ ์๋๊ฑฐ
> ์๋๊ฐ์?
>
[์ง๋ฌธ3]
์ด๊ฑด call by reference์ ๊ด๋ จ๋ ๊ฒ ๊ฐ๊ตฐ์. ๋ Aliasing๋....
์ด์๊ฐ์ด ์๋ก์ด Allocation์ ํด์ฃผ๊ณ ๊ฐ์ ๊ฐ์ string copy๋ฅผ ํ๋ ์ด์ ๋
์ ํ๋ค๋ฅธ ๋ฒ์ฃผ์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํจ์
๋๋ค.
>๊ทธ๋ฅ vartable[i].name = name; vartable[i].val = val; ์ด๋ ๊ฒ ํ๋ฉด
๋๋๊ฑฐ์๋๊ฐ์ฌ? ์ด์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋น๊ทผ segment ์๋ฌ๊ฐ ๋จ์ด์ง๊ฒ ์ง์? ๊ทธ๋ฆฌ๊ณ
๋๋ค๊ณ ํ๋๋ผ๋ copy๋ฅผ ํด์ฃผ์ง ์๊ณ ๋ฒ์ง์๋ฅผ ์ง์ ์ฃผ์์ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด๊ฒ์ Aliasing์ด๋ผ๊ณ ํฉ๋๋ค.
์ฆ ์ฃผ ํจ์์์ name์ด๋ val์ ์๋ก์ด ๊ฐ์ Assignํ๊ฒ๋๋ฉด structure์์ ๊ฐ๋
๊ธฐ๋ฅ ๋ฐ๋๋๋ค. ๋๊ฐ์ ์ฃผ์๋ฅผ ์๋ก ๋ค๋ฅธ name์์ referencing ํ๊ฒ ๋ฉ๋๋ค.(ํ.
์๋ ์ graphics์ ์ํ ์ถ์ต์ด.......)
>๋งค๊ฐ๋ณ์๋ก ๋์ด์จ name๊ณผ val์ ์ด๋ฏธ ์์ญ์ด ์กํ์๋ ์์ ํ ํฌ์ธํฐ ์๋๋๊น?
์์ ํ ํฌ์ธํฐ์ ๋๋ค.
>๊ทธ๋ฐ๋ฐ ์ ๊ทธ๋ ๊ฒ ๋ malloc์ ์ก๊ณ ์ ๋ ๊ฒ ํ์ฃ ?
์์์ ์ค๋ช ๋๋ฆฐ ๊ฒ์ฒ๋ผ ์๋ก์ด ์์ญ์ ์ก์์ copyํ๋ ๊ฒ๋๋ค.
-------------------------
์ค๋ช
์ด ์๋์๋์ง ๋ชจ๋ฅด๊ฒ ๊ตฐ์. ์กธ์์ด ์๋๋ธ๋ก..................... ์ ๊ทธ๋ฆฌ๊ณ
ํฌ์ธํฐ๋ง ๊ด๋ จ๋ ์ฑ
์ด ์์ต๋๋ค. ํ๋ ์ค๋๋์ ๊น๋จน์๋๋ฐ ๊ทธ๊ฑธ ํจ ๋ณด์๋ฉด
์ฒ์ฌ๋์ญ๋๋ค. ์ฃผ์ ๋ฆฌ์ฃผ์ ๋ฆฌ ํ๋ง ๋๋
๋๋ค.
>ํฌ์ธํฐ๋ง ๊ด๋ จ๋ ์ฑ
์ด ์์ต๋๋ค. ํ๋ ์ค๋๋์ ๊น๋จน์๋๋ฐ ๊ทธ๊ฑธ ํจ ๋ณด์๋ฉด
>์ฒ์ฌ๋์ญ๋๋ค. ์ฃผ์ ๋ฆฌ์ฃผ์ ๋ฆฌ ํ๋ง ๋๋
๋๋ค.
>
>
>
-----------------===== Posted via NetPle Usenet Service =====-----------------
http://news.NetPle.com ์ ์ ์ํ์๋ฉด ์๋ก์ด ์ ์ฆ๋ท์ด ์ด๋ฆฝ๋๋ค.
์ฌ์ฉํ ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ malloc์ ์๋ฌด ๊ด๊ณ๊ฐ ์์ต๋๋ค. ํฌ์ธํฐ๋ ๊ทธ๋ฅ ๋ฉ๋ชจ๋ฆฌ
์ด๋๊ฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ์์
๋๋ค. ๊ทธ๋์ 1๋ฒ์ ๊ฒฝ์ฐ์๋ "1234567890"์ด๋ผ๋
์คํธ๋ง์ด ์ ์ฅ๋์ด ์๋ ๋ฐ์ดํฐ ์์ญ์ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค. 2๋ฒ์ ๊ฒฝ์ฐ๋
malloc()์ ์ธ ๋ฐ ์์ด ํ ๊ฒ์
๋๋ค. malloc()์ผ๋ก ์ป์ด์ง 10๋ฐ์ดํธ ๋ฐ์ดํฐ๋
์ฐ๋ ๊ธฐ๊ฐ ๋์ง์. ๋ค์๊ณผ ๊ฐ์ ์๋ฅผ ๋๋ ๊ฒ์ด ๋ ๋ณ์ ๋ณด์
๋๋ค.
2-1:
char *p1, *p2;
p1 = "1234567890";
p2 = malloc(11);
strcpy(p2, p1);
์ด๋ ๊ฒ ํ๋ฉด p1์ "1234567890"์ด ์๋ ๋ฉ๋ชจ๋ฆฌ์ ๋งจ ์์ ๊ฐ๋ฆฌํค๊ณ p2๋ ํ ์์ญ
์ด๋๊ฐ๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋์ด p1๊ณผ p2๋ ์๋ก ๋ค๋ฅธ ๊ณณ์ ๊ฐ๋ฆฌํค๊ณ ์์ง๋ง, ๊ฐ๋ฆฌํค๋
๊ณณ์ ์๋ ๊ฐ์ ๊ฐ๊ฒ ๋ฉ๋๋ค.
>
> --------------------------------------------------------------------------
--
> ์ง๋ฌธ2
>
> ๋ผ์ธ 1: char p1[10];
> ๋ผ์ธ 2: char *p1;
> p1 = malloc(10);
>
> ๋ผ์ธ 1๊ณผ ๋ผ์ธ 2๋ ๊ฐ์ ๋ง์ด์ฃ ? ๊ทธ๋ผ
>
> ๋ผ์ธ 3: char p2[];
> ๋ผ์ธ 4: char *p2;
>
> ๋ผ์ธ 3๊ณผ ๋ผ์ธ 4๋ ๊ฐ์ ๋ง์ธ๊ฐ์?
>
>
์ ํ ๋ค๋ฅธ ์ด์ผ๊ธฐ์
๋๋ค. 1์์ p1์ ๋ฌธ์ ๋ฐฐ์ด์ด๊ณ , 2์์๋ ๋ฌธ์ ํฌ์ธํฐ์
๋๋ค.
๋ฐฐ์ด๊ณผ ํฌ์ธํฐ๋ ๊ฐ์ semantics๋ก ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๋ ์์ผ๋, ์ ํ ๋ค๋ฅธ
semantics๋ฅผ ๋ณด์ด๋ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ ์ด ๋์ ๊ฐ์ ๊ฒ์ผ๋ก ์ดํดํ๋ฉด ์ค๋ฅ๊ฐ
๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค. 3์ ansi C์์๋ ์ฐ์ง ์๋ ํํ์
๋๋ค. ๋ง์ฝ
3-1: extern char p2[];
4-1: extern char *p2;
์ด๊ฒ์ด ๊ฐ์ ํํ์ด๋๊ณ ๋ฌผ์ผ์ ๊ฒ์ด๋ผ๋ฉด, ๊ทธ ๊ฒฝ์ฐ์๋ ์์ ํ ๋ค๋ฅธ ๊ฒ์
๋๋ค.
์ด๊ฒ์ ํฌ์ธํฐ ๋ ํผ๋ฐ์ฑ๊ณผ ์ด๋ ์ด ๋ ํผ๋ฐ์ฑ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ์ธ๋ฐ,
์ด๋ณด์๋ผ๋ฉด ๋ฐฐ์ด๋ก ๋ฐ๋์ ์ ์(definition)๋ ๊ฒ์ ๋ฐฐ์ด๋ก
์ ์ธ(declaration)ํ๊ณ ํฌ์ธํฐ๋ก ์ ์๋ ๊ฒ์ ํฌ์ธํฐ๋ก ์ ์ธํ๋ค๊ณ ์ดํดํ์๋
๊ฒ์ด ์ข์ต๋๋ค.
> --------------------------------------------------------------------------
์ดํดํ์
์ผ ํ ๊ฒ์ ํฌ์ธํฐ๋ฅผ ๋์
ํ๋ค๋ ๊ฒ์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํ๋ค๋
๊ฒ์ ์๋ฏธํ๊ณ , strcpy๋ฅผ ํ๋ค๋ ๊ฒ์ ํ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๊ฐ์
๋ค๋ฅธ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณต์ฌํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ ๋ ์ง์ด๋ฃ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์๋ฉด ์ฝ์ต๋๋ค.
querystr = (char *) malloc( size );
valuestr = (char *) malloc( size );
querystr์ ๊ฐ ์ง์ด๋ฃ๋ ์ฝ๋; ๊ฐ "a"
valuestr์ ๊ฐ ์ง์ด๋ฃ๋ ์ฝ๋; ๊ฐ "b"
(1) insert_value( querystr, valuestr );
querystr์ ๋ค๋ฅธ ๊ฐ ์ง์ด๋ฃ๋ ์ฝ๋; ๊ฐ "c"
valuestr์ ๋ค๋ฅธ ๊ฐ ์ง์ด๋ฃ๋ ์ฝ๋; ๊ฐ "d"
(2) insert_value( querystr, valuestr );
๋๊ป์ ๋ง์ํ์ ๋๋ก ํฌ์ธํฐ ๋์
์ ํ๋ค๋ฉด, (1)์์ ๊ฐ์ ๋ฃ์ ๋
variable[0].name์ querystr๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๊ณ , variable[0].val์
valuestr๊ณผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค. (2)์์ ๊ฐ์ ๋ฃ์ ๋์๋
variable[0].name์ querystr๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๊ณ , variable[0].val์
valuestr๊ณผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ผ variable[0].name์ด ๊ฐ๋ฆฌํค๋
๋ฉ๋ชจ๋ฆฌ์๋ ๋ฌด์จ ๊ฐ์ ์ ์ฅ๋์ด ์์๊น์? ๊ทธ๋ฆผ์ ๊ทธ๋ ค๋ณด์๋ฉด์ ๊ณผ์ ์ ๋ฐ๋ผ๊ฐ๋ฉด
์ฝ๊ฒ ๋ต์ ๋ด์ค ์ ์์ ๊ฒ์
๋๋ค.
----
Kim, Sung-Ryong
te...@oski.co.kr
http://www.oski.co.kr
--
______________________________________________________________
ARA Network Technologies Co., Ltd.
Jeong-Ho Jang
Research Engineer
Tel : +82-042-828-7770 (413), Fax : +82-042-828-7771
Mobile : +82-011-9400-8022
jhj...@aratech.co.kr
http://cestlavie.homeip.net
--------------------------------------------------------------
<love...@dreamwiz.com> wrote in message
news:9afdhu$u0d$1...@news.netple.com...
๊ทธ๋ ๊ตฐ์..
๊ทธ๋ฐ๋ฐ ํ๊ฐ์ง ์ดํด๊ฐ ๊ฐ์ง ์๋ ๋ถ๋ถ์ด ์์ต๋๋ค.
[์ง๋ฌธ3]์ ์คํํด ๋ณธ๊ฒฐ๊ณผ ๊ทธ๋ฅ vartable[i].name = name; vartable[i].val = val;
--------------------------------
----------------
์ด๋ ๊ฒ ํด๋ ์๋ฌ๋ ๋ฐ์ํ์ง ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ๋์ ๋ต๋ณ์ค์
> copy๋ฅผ ํด์ฃผ์ง ์๊ณ ๋ฒ์ง์๋ฅผ ์ง์ ์ฃผ์์ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
> ์ด๊ฒ์ Aliasing์ด๋ผ๊ณ ํฉ๋๋ค.
์ด๋ฐ ๋ง์ด ์๋๋ฐ.. ๋ฒ์ง์๋ฅผ ์ง์ ์ฃผ์์ ๋ ์ด๋ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ ๋ง์ธ๊ฐ์?
์ฃ์กํฉ๋๋ค๋ง,, ์ข ๋ ์์ธํ๊ฒ ์ค๋ช ํด ์ฃผ์ค์ ์์ต๋๊น?
์๋๋ฉด.. ์ด ๋ฌธ์ ์ ๊ด๋ จ๋ ์ฐธ๊ณ ์์ ์ด๋๋ ์๋ ค์ฃผ์๊ฒ ์ต๋๊น?
๊ทธ๋ผ.. ๋ ๋ต๋ณ ๋ถํ๋๋ฆฝ๋๋ค. ^^
๊ทธ๋ฐ๋ฐ ํ๊ฐ์ง ์ง๋ฌธ์ด ์์ต๋๋ค.
๋์ ๋ง์์ค์ ๋ค์๊ณผ ๊ฐ์ ๋ง์ด ์์ต๋๋ค.
> > ๋ผ์ธ 3: char p2[];
> > ๋ผ์ธ 4: char *p2;
>
> ์ ํ ๋ค๋ฅธ ์ด์ผ๊ธฐ์
๋๋ค. 1์์ p1์ ๋ฌธ์ ๋ฐฐ์ด์ด๊ณ , 2์์๋ ๋ฌธ์
ํฌ์ธํฐ์
๋๋ค.
>๋ฐฐ์ด๊ณผ ํฌ์ธํฐ๋ ๊ฐ์ semantics๋ก ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๋ ์์ผ๋, ์ ํ ๋ค๋ฅธ
>semantics๋ฅผ ๋ณด์ด๋ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ ์ด ๋์ ๊ฐ์ ๊ฒ์ผ๋ก ์ดํดํ๋ฉด ์ค๋ฅ๊ฐ
>๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
๋ฌธ์๋ฐฐ์ด๊ณผ ๋ฌธ์ ํฌ์ธํฐ๊ฐ ๋ค๋ฅด๋ค๋๊ฒ์ ์ด๋์ ๋ค์ ๊ธฐ์ต์ด ๋๋๋ฐ..
์ด๋ป๊ฒ ๋ค๋ฅธ๊ฑด์ง ์ข๋ ์์ธํ๊ฒ ๋ง์ํด์ฃผ์ค์ ์๋์? ์ ๊ฐ ์ด์ ๊น์ง
์ฌ์ฉํ๊ฒ๋ค์
์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ ๊ฐ๋
์ด ๋๋ฌด๋๋ ๋์ผํด์ ์ ๋ ํฌ์ธํฐ์ ๋ฐฐ์ด์ ๊ฑฐ์
๋์ผํ๊ฒ
๊ฐ์ฃผํ์์ต๋๋ค. ๋๋์ฒด ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๊ธธ๋ ๋ค๋ฅด๋ค๊ณ ๋ง์ํ์๋ ๊ฑด๊ฐ์?
์์ ์ง๋ฌธ์ ์จ ๋๊ณ ๋ณด๋ ์ ๊ธ์ด ์๋นํ ๊ณต๊ฒฉ์ ์ธ๊ฒ์ฒ๋ผ ๋ณด์ด๋ค์..
์ฉ์ํ์๊ตฌ์. ^^
์๋ํ๊ฑด ์๋๊ตฌ์.. ์ด๋ป๊ฒ ๋ค๋ฅด๊ฒ ํํํ ๋ฐฉ๋ฒ์ด ์๋ค์. ^^;;;
----
๊ธ๊ตฌ ์ ๋ ์๋นํ ์ค๋๊ธฐ๊ฐ(์ง์ฅ์ ์๋ค๋
์ง๋ง) ํ๋ก๊ทธ๋จ์ ๊ณต๋ถํ๋ค๊ณ
์๊ฐํ๋๋ฐ
์์ง๋ ์ด๋ฐ ๋ฌธ์ ์ ๋ถ๋ซํ๋ฉด ๋จธ๊ฐ๋จผ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋์ ๋๋์ฒด C์ธ์ด๋ฅผ
์ด๋ป๊ฒ ๊ณต๋ถํ์๋์? ์์ค์ ๋์จ ์ผ๋ฐ์ ์ธ C ์ฑ
์๋ ์ ์ ๋ฌผ์์ ๋๋ตํด ์ค ์
์๋
์ฑ ์ ๋ณด์ง ๋ชปํ์ต๋๋ค. (๋ฌผ๋ก ์ ๊ฐ ์ฐพ์ง ๋ชปํด์ ๊ทธ๋ด์๋ ์์ง๋ง.. ^^;;)
C์ธ์ด ํ์ค ๋ฌธ์ ๊ฐ์ ๊ฒ๋ค์ ๋ณด์๋ฉด์ ์ต๋ํ์ ๊ฑด๊ฐ์?
์๋๋๋ค. ๋์ผํ notation์ด ์๋๋๋ค. ๋ผ์ธ 3์ char ํ ๋ณ์๋ฐฐ์ด์ ์ ์ธํ
๊ฒ์ด๋ฉฐ,
๋ผ์ธ 4๋ char ํ ํฌ์ธํฐ ๋ณ์๋ฅผ ์ ์ธํ ๊ฒ์
๋๋ค. *p2๋ p2[]๊ฐ ๋ชจ๋ array์
์ฒซ๋ฒ์งธ ์์ ๋ฒ์ง
์๋ฅผ ๋ํ๋ธ๋ค๋ ์ค๋ช
๋ํ ๋ง์ง ์์ต๋๋ค.
๋ผ์ธ3์ ์ ํํ ํํํ์๋ฉด char p2[];๋ incomplete array type ์ผ๋ก ์ ์ธ๋
๊ฒ์
๋๋ค.
๋ค์์ ํฌ์ธํฐ์ ๋ฌธ์์ด๋ฐฐ์ด๊ณผ ๊ด๋ จ๋ ๊ฐ๋จํ ์ ์ ๋๋ค .
์๋์ ๊ฐ์ด ์ ์ธ๋์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
char p1[] = "always writable";
char *p2 = "possible not writable ";
p1[0]='x'์ ๊ฐ์ ํ ๋น์์ ์ธ์ ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ p2[0]='x'์ ๊ฐ์
ํ ๋น์์ ๊ฐ๋ฅํ ์๋ ์์ผ๋ฉฐ, run-time error๋ฅผ ๋ฐ์์ํฌ ์๋ ์์ต๋๋ค. ์ฆ,
์ด์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ, ์ด์ ๊ฐ์ ์์ ์์กดํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด์ฒ๋ผ ๋์ ๋น์ทํด๋ณด์ด์ง๋ง ์ ํ ๋ค๋ฆ
๋๋ค. ํฌ์ธํฐ์ ๋ฌธ์์ด๋ฐฐ์ด์ด ๋์ผํ๋ค๊ณ
๋ง์ฐํ๊ฒ ๊ฐ๋
์ ๋ฆฌํ๊ณ ์๋ค๊ฐ, ์ ์ ๊ฐ์ ๊ฒฝ์ฐ์์ ์ข์ ?ํ๊ธฐ ์ฝ์ฃ ...
๋ฐฐ์ด๊ณผ ํฌ์ธํฐ์์ ์ฐ๊ด๊ด๊ณ๊ฐ ํผ๋์ ์ด๋ํ๋ ๊ฐ๋
์ด๊ธฐ ๋๋ฌธ์ ์ฒ์์ ๋ถ๋ช
ํ
์ฐจ์ด์ ์
๋๊ณ ๊ฐ๋
์ ๋ฆฌ๋ฅผ ๋ช
ํํ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ผ๋จ, ํ์ด๋ ์คํ์ด๋ ํ๋ ๊ฐ๋
์ ๋ฌด์ํ๊ณ , ํ์ค์์ ์ฌ์ฉํ๋ 3๊ฐ์ง ๊ธฐ
์ต๋ถ๋ฅ๋ง์ผ๋ก ์ค๋ช
์ ๋๋ฆฌ๊ฒ ์ต๋๋ค. ํ์ ํน์ ์์คํ
์ ์ถ์์ ๋ด์ฉ์ ์
์ฉ์ํค๋ฉด์ ์ฝ๊ฒ ์ดํดํ์ค ์ ์์ผ๋ฆฌ๋ผ ๋ฏฟ์ต๋๋ค.
๋ผ์ธ1: p1 ๋ผ๋ char * ํ์ ํฌ์ธํฐ๋ฅผ ์ ์ธํฉ๋๋ค. "1234567890" ์ ์ ์
๊ธฐ์ต๋ถ๋ฅ (static) ๋ฅผ ๊ฐ์ง๋ char ํ์ ๋ฐฐ์ด (array of char) ์
๋
๋ค. *) ๋ฐฐ์ด์ ํฌ์ธํฐ ๋ณํ์ ์ํด, ํฌ์ธํฐ p1 ์๋ "1234567890"
์ค ์ฒซ๋ฒ์งธ ์์์ธ 1 ์ ๊ฐ๋ฅดํค๋ ํฌ์ธํฐ๊ฐ ๋์
๋ฉ๋๋ค.
*) ๋ ์ญ์๋, ๋ฌธ์์ด "์์" ์ธ๋ฐ, ์ด๋ป๊ฒ ๋ฐฐ์ด์ด ๋ ์ ์๋๋๋ ๋ฑ์ ํญ
์์ฑ ์ง๋ฌธ์ ๋ฏธ๋ฆฌ ๋ตํฉ๋๋ค. ์ ์๋ ์ด์ผ๊ธฐํ์ง๋ง ๋ฌธ์์ด ์์๋ (์ฌ์ค
์, "์์" ๋ผ๋ ์๋ฏธ๋ ์์ด์ฉ์ด์๋ ์์ต๋๋ค. string literal ์ด์ฃ )
C ์์ lvalue ์
๋๋ค. ๋ฐ๋ผ์, ์๋์ ๊ฐ์ ํ๋๋ ๊ฐ๋ฅํฉ๋๋ค.
printf("%c\n", "1234567890"[3]);
๋ผ์ธ2: p1 ์ด๋ผ๋ char * ํ์ ํฌ์ธํฐ๋ฅผ ์ ์ธํฉ๋๋ค. malloc ๋ก allocated
(์ฌ์ฉ์์ ์ํด ํ ๋น๋๊ณ , ์ฌ์ฉ์์ ์ํด ํด์ ๋๋) ๊ธฐ์ต๋ถ๋ฅ๋ฅผ ๊ฐ
๋ 10 bytes ์ ๊ธฐ์ต์ฅ์๋ฅผ ํ ๋น๋ฐ์ ๊ทธ ์ฒซ๋ฒ์ง๋ฅผ p1 ์ด ๊ฐ๋ฅดํค๋๋ก
ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋, ๋ค์๊ธ p1 ์ ์ ๋ผ์ธ1์์ ํ๋ ํ๋์ ํฉ๋
๋ค. ์ด๋ malloc ๋ก ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ด๋ฒ๋ฆฐ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋
๋ค. (์ด๋ป๊ฒ p1 ์ ๋์
๋์๋ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ฒ์ง๋ฅผ ๋ณต๊ตฌํด ๋ด๊ฒ
์ต๋๊น?)
>
>๊ฒฝํ์ ๋ณด๋ฉด ๋ผ์ธ 1๊ณผ ๊ฐ์ด ํ๋ ๊ฒฝ์ฐ๋ p1 ๋ณ์์ ๋ค์ด๊ฐ ๊ฐ์ด
>์์ ๊ฒฝ์ฐ์ด๋ฉฐ..๋ง์ผ ํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋๋ฐ ์ฌ์ฉํ ๋ณ์์ธ๋ฐ malloc์ ์ฌ์ฉํ์ง
>์์ผ๋ฉด ํฌ์ธํฐ ์๋ฌ๊ฐ ๋๋๊ตฐ์.. ๊ทธ๋์ ํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด
>malloc์ ์ฌ์ฉํด์ผ ํ๋๊ตฐ์..
์ ๊ฐ ๋ณด๊ธฐ์ ์์ ํ๋์ ์ด ์ค๋ช
๊ณผ ์๋ฌด๋ฐ ๊ด๊ณ๊ฐ ์์ต๋๋ค. ๋์ด ์๋ฏธํ
๋ ๊ฒ์ด ๋ฌด์์ธ์ง๋ ์๊ฒ ์ง๋ง, ์์ ๊ฐ์ ํ๋์ 10 bytes ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฒ
๋ฆฌ๋ ๊ฒฐ๊ณผ๋ง์ ์ด๋ํฉ๋๋ค.
์ด๋ ํ์ค์์ ์๊ตฌํ๋ ๋ฐ๋ ์๋์ง๋ง, ๋๋ถ๋ถ์ ์์คํ
์์๋ ์ ์ ๊ธฐ์ต
๋ถ๋ฅ๋ฅผ ๊ฐ๋ ๋์์ฒด๋ฅผ ์ ์ ํ๋ ๋ฉ๋ชจ๋ฆฌ์ allocated ๊ธฐ์ต๋ถ๋ฅ๋ฅผ ๊ฐ๋ ๋์
์ฒด๋ฅผ ์ ์ฅํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐ๋ก ๋๋ฉฐ, ์ด ๋ฉ๋ชจ๋ฆฌ์ ํ๋ฝ๋๋ ํฌ๊ธฐ์ญ์ ๋ค๋ฆ
๋
๋ค. (์ผ๋ถ ํ๊ฒฝ์์๋ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ด๋ผ๋ ๊ฒ์ ์ฌ์ฉํด์, ์ด ํฌ๊ธฐ๋ค์ ์์
์ ํ๋ก๊ทธ๋จ์ ์ต์ ํ์ํฌ ์ ์๋๋ก ํ๊ณ ์์ต๋๋ค) ๋ฐ๋ผ์, allocated
๊ธฐ์ต๋ถ๋ฅ๋ฅผ ๊ฐ๋ ๋์์ฒด๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ ํฌ๊ฒ ํ๋ฝ๋๋ค๋ฉด, ๋์ด ๋ง์ํ
์
จ๋ฏ์ด ์ ์ ๋ฐฐ์ด๋ฑ์ผ๋ก ๋์์ฒด๋ฅผ ๋ค๋ฃฐ ๋๋ณด๋ค ๋ ๋๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ป์ ์
์๊ธฐ๋ ํฉ๋๋ค. ํ์ง๋ง, ์ด๋ฌํ ์ฌํญ๋ค์ ํ๊ฒฝ์ ์์กด์ ์ธ ๊ฒ์ด๋ฉฐ ํ์ค์์
๋ ์ด๋ ํ ์ ์๋ ์๊ตฌ๋ ํ๊ณ ์์ง ์์ต๋๋ค. ๋ฐ๋ผ์, ๋ ๊ทธ๋ ๋ค๊ณ ์ผ๋ฐํ
ํด์๋ ์๋ฉ๋๋ค. *)
*) ํ์ค์ ํ๋์ strictly conforming (๊ฐ์ฅ ์ด์์ฑ์ด ํฐ) program ์ด ๊ฐ
์ง ์ ์๋ ์ ์ ๋์์ฒด์ ํฌ๊ธฐ๋ฅผ ๋ช
์ํด๋์ด, ๋ชจ๋ ํ์ค์ ๋ฐ๋ฅด๋
implementation ์ด ์ต์ํ ๊ทธ๊ฒ๋งํผ์ ์ง์ํ๋๋ก ํ๊ณ ์์ต๋๋ค.
[Translation limits] ํ์ง๋ง, ์ง๊ทนํ ์ต์ํ์ ์๊ตฌ์ด๊ธฐ ๋๋ฌธ์, ๋๋ถ
๋ถ์ implementation ์ ๋ณดํต ๊ทธ๋ณด๋ค ํจ์ฌ ๋ง์ ์ฌ์ ๋ฅผ ๋๊ณ ์์ต๋๋ค.
>
>๊ทธ๋์ ์ ๋ ๊ทธ๋ ๊ฒ ์๊ฐํ์ต๋๋ค. "๋ผ์ธ 1๊ณผ ๊ฐ์ด ํ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ
>์ผ์ ํ ํฌ๊ธฐ์ ์์ญ์ ์๋์ผ๋ก ์ก๊ธฐ๋๋ฌธ์ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ๋๋ ๋ผ์ธ 1๊ณผ ๊ฐ์ด
>์ฌ์ฉํ๊ณ , ๋ฃ์ ๊ฐ์ด ํฐ๊ฒฝ์ฐ๋ ๋ฐ๋์ malloc์ ์ฌ์ฉํด์ผํ๋ค" <-- ์ด๋ง์ด
>๋ง์ต๋๊น?
>๋ง๋ค๋ฉด? ๋๋์ฒด ์ด๋์ ๋ ํฌ๊ธฐ๊น์ง๊ฐ malloc์ผ๋ก ์ก์ ํ์๊ฐ ์๋๊ฑด๊ฐ์?
๋์ด ์์
์ ํ๊ณ ์๋ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ง์ด ๋ฌ๋ผ์ง๋๋ค. ์ฌ์ง์ด๋ ๋์ผํ ํ
๊ฒฝ์์๋ผ๋, ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ด๋ ํ ์ํฉ์ ์๋๋์ ๋ฐ๋ผ์๋ ๋ฌ๋ผ์ง ์ ์์ต๋
๋ค. ๋ฐ๋ผ์, ๋ช
์์ ์ผ๋ก ์ด๋งํผ์ ํญ์ ๊ฐ๋ฅํ๋ค๊ณ ๋ง์๋๋ฆด ์๋ ์์ผ๋ฉฐ,
๋ ์์ธํ ์ฌํญ์ ๋์ ํ๋ก๊ทธ๋๋ฐ ํ๊ฒฝ์ ๊ตฌ์ฑํ๋ ์์๋ค์ ์ํด ์ ์๋ฉ
๋๋ค. C ํ์ค์ malloc ๋ฅ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํจ์์ ์ํด ํ ๋น๋๋ ๋ฉ๋ชจ๋ฆฌ์
์์ฑ, ๊ทธ์ ๊ด๋ จ๋ ํฌ์ธํฐ์ ๊ฐ, ํ ๋น์ ์คํจ์ฌ๋ถ๋ฑ์ ๋ํ ์ ์๋ง์ ํ๊ณ
์์ต๋๋ค.
>(๋ณดํต ๋ผ์ธ1๊ณผ ๊ฐ์ด ํ ๊ฒฝ์ฐ ๋ง๋ก์ผ๋ก ์์ก๊ณ ๋ผ์ธ1๊ณผ๊ฐ์ด ๊ทธ๋ฅ ๋ฃ๊ณ printf
>ํ์์์..)
>
>----------------------------------------------------------------------------
>์ง๋ฌธ2
>
> ๋ผ์ธ 1: char p1[10];
> ๋ผ์ธ 2: char *p1;
> p1 = malloc(10);
>
>๋ผ์ธ 1๊ณผ ๋ผ์ธ 2๋ ๊ฐ์ ๋ง์ด์ฃ ? ๊ทธ๋ผ
์๋๋๋ค. ๊ฐ์ ๋ง์ด๋ผ๋ฉด, ๊ฐ๊ฐ ์์ ๊ฐ์ด ์ ์ธํ๊ณ ์๋์ ํ๋์ด ๋ชจ๋ ๊ฐ
๋ฅํด์ผ ๊ฒ ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค. ์ด์ ๋ ์๋ Kong Hyeog Jun ๋์ ๋ต๋ณ์
์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
char array[10];
[๋ผ์ธ1 ํน์ ๋ผ์ธ2๊ฐ ๋์ด]
p1 = array; /* ๋ผ์ธ1์ ๋ถ๊ฐ๋ฅํ์ง๋ง, ๋ผ์ธ2์ผ ๊ฒฝ์ฐ๋ ๊ฐ๋ฅ */
>
> ๋ผ์ธ 3: char p2[];
> ๋ผ์ธ 4: char *p2;
>
>๋ผ์ธ 3๊ณผ ๋ผ์ธ 4๋ ๊ฐ์ ๋ง์ธ๊ฐ์?
>
Kong Hyeog Jun ๋์ ๋ต๋ณ์ ์ฐธ๊ณ ํ์ธ์.
--
Jun Woong (myco...@hanmail.net)
Dept. of Physics, Univ. of Seoul
Cell: +82 16 467 6247
Web : http://c-expert.uos.ac.kr (Korean only)
์๋, ์ฅ์ ํธ๋์ ๋ต๋ณ์ค์์ ์ฅ์ ํธ๋์ด ๊ฐ์ ํ์ ์ํฉ์ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋
๋๋ค. ๋์ด ์ ์ฒด ์์ค๊ฐ ์๋ ๋ถ๋ถ์ ์ธ ์์ค๋ง์ ์ธ์ฉํ์
จ๊ธฐ ๋๋ฌธ์, ์ ๋ฅผ
ํฌํจํ ๋๋ถ๋ถ์ ๋ถ๋ค์ 2-3๋ฒ์งธ ์
๋ ฅ์ main() ์์์ ๋์ด์ malloc ๋ฅผ
ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ง ์๊ณ ์ด๋ฏธ ์ฒซ๋ฒ์งธ ์
๋ ฅ์์ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ทธ
๋๋ก ์ฌ์ฉํ์ฌ insert...() ํจ์๋ฅผ ์ด์ฉํ๋ค๊ณ ์๊ฐํ๊ณ ์์ต๋๋ค. ์ฅ์ ํธ
๋์ ๊ฐ์ ์ ๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ ์ํฉ์ ๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ ค๊ฐ๋ฉด์ ์ดํดํด ๋ณด์๊ธฐ ๋ฐ
๋๋๋ค.
๋ฌผ๋ก , p1 ์ ๊ฒฝ์ฐ p1 ์ ์์๋ฅผ ์์ ํ๋ ํ๋์ด undefined ์ด์ง๋ง, p2 ์
๊ฒฝ์ฐ์๋ ์ง๊ทนํ ์ ์๋ ํ๋์ ํ๋ ์ฐจ์ด๊ฐ ์์ง์.
>>
>> --------------------------------------------------------------------------
>--
>> ์ง๋ฌธ2
>>
>> ๋ผ์ธ 1: char p1[10];
>> ๋ผ์ธ 2: char *p1;
>> p1 = malloc(10);
>>
>> ๋ผ์ธ 1๊ณผ ๋ผ์ธ 2๋ ๊ฐ์ ๋ง์ด์ฃ ? ๊ทธ๋ผ
>>
>> ๋ผ์ธ 3: char p2[];
>> ๋ผ์ธ 4: char *p2;
>>
>> ๋ผ์ธ 3๊ณผ ๋ผ์ธ 4๋ ๊ฐ์ ๋ง์ธ๊ฐ์?
>>
>>
>
>์ ํ ๋ค๋ฅธ ์ด์ผ๊ธฐ์
๋๋ค. 1์์ p1์ ๋ฌธ์ ๋ฐฐ์ด์ด๊ณ , 2์์๋ ๋ฌธ์ ํฌ์ธํฐ์
๋๋ค.
>๋ฐฐ์ด๊ณผ ํฌ์ธํฐ๋ ๊ฐ์ semantics๋ก ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๋ ์์ผ๋, ์ ํ ๋ค๋ฅธ
>semantics๋ฅผ ๋ณด์ด๋ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ ์ด ๋์ ๊ฐ์ ๊ฒ์ผ๋ก ์ดํดํ๋ฉด ์ค๋ฅ๊ฐ
>๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค. 3์ ansi C์์๋ ์ฐ์ง ์๋ ํํ์
๋๋ค. ๋ง์ฝ
ํ์ค์์๋ ์ถฉ๋ถํ ์ ์ํ๊ณ ์๋, ์์ฃผ ์ ์ฐ๋ ํํ์
๋๋ค. ์๋ ์ฝ๋๋ฅผ
-ansi, -pedantic -Wall ์ต์
์ผ๋ก gcc ๋ก ์ปดํ์ผ ํด๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
(๋ฌผ๋ก , ๊ทธ๋ ๋ค๊ณ ํด์ gcc ๊ฐ C90 ์ด๋ C99 ํ์ค์ ์๋ฒฝํด ๋ฐ๋ฅธ๋ค๋ ๊ฒ์
์๋๋๋ค)
#include <stdio.h>
char p2[]; /* line A */
int main(void)
{
extern char p2[10];
printf("%lu\n", (unsigned long)sizeof(p2));
return 0;
}
line A ์์, p2 ์ type ์, array of char ์ด๋ฉฐ, ๊ทธ ํฌ๊ธฐ๋ฅผ ์ ์ ์๊ธฐ์
incomplete type ์
๋๋ค. ๋ธ๋ญ์์์ p2 ์ ์ถ๊ฐ์ ์ธ ์ ์ธ์ ์ํด composite
type ์ ๋ง๋ค๊ฒ ๋ฉ๋๋ค.
๋๋ ทํ ์ฆ๊ฑฐ๊ฐ ์์ ๋๋, ์ฃผ์ฅ์ ๊ทผ๊ฑฐ๋ก ํ์ค์ ์ฌ์ฉํ๋ ์ผ์ด ์์์ผ๋ฉด
ํฉ๋๋ค. ๊ทผ๊ฑฐ๋ก์ ํ์ค๋งํผ ์ค๋์ฑ์ ๊ฐ๋ ๊ฒ๋ ์์ง๋ง, ๊ทธ๋ฆ๋ ๋ด์ฉ์ ์ฃผ
์ฅํ ๋ ๋ท๋ฐ์นจ๋๋ค๋ฉด ๋ฌธ์ ๋ ๊ทธ๋งํผ ์ปค์ง๋ค๊ณ ์๊ฐํฉ๋๋ค.
>
>3-1: extern char p2[];
>4-1: extern char *p2;
>
>์ด๊ฒ์ด ๊ฐ์ ํํ์ด๋๊ณ ๋ฌผ์ผ์ ๊ฒ์ด๋ผ๋ฉด, ๊ทธ ๊ฒฝ์ฐ์๋ ์์ ํ ๋ค๋ฅธ ๊ฒ์
๋๋ค.
>์ด๊ฒ์ ํฌ์ธํฐ ๋ ํผ๋ฐ์ฑ๊ณผ ์ด๋ ์ด ๋ ํผ๋ฐ์ฑ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ์ธ๋ฐ,
>์ด๋ณด์๋ผ๋ฉด ๋ฐฐ์ด๋ก ๋ฐ๋์ ์ ์(definition)๋ ๊ฒ์ ๋ฐฐ์ด๋ก
>์ ์ธ(declaration)ํ๊ณ ํฌ์ธํฐ๋ก ์ ์๋ ๊ฒ์ ํฌ์ธํฐ๋ก ์ ์ธํ๋ค๊ณ ์ดํดํ์๋
>๊ฒ์ด ์ข์ต๋๋ค.
๋จ, ํจ์์ ๋งค๊ฐ๋ณ์์์๋ ๋งค๊ฐ๋ณ์ ๋ค์์ฐ๊ธฐ (rewrite) ๊ฐ ์ผ์ด๋๊ธฐ
๋๋ฌธ์ ์ด๋ ํ ์ฐจ์ด๋ ์์ต๋๋ค. ์์ ๊ฒฝ์ฐ ๋ง์ํ์ array referencing
๋ฑ์ผ๋ก ๋ฌด์์ ์๋ฏธํ์๋ ค ํ๋ ๊ฒ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ์ ๊ฐ๊ฐ์ ์์๋ง
์ผ๋ก๋ ์๋ฌด๋ฐ ๋ฌธ์ ๋ ์์ต๋๋ค. ๋ค๋ง, ์ ํ ๋ค๋ฅธ type ์ ๊ฐ๋ ๊ฒ ๋ฟ์ด๋ฉฐ,
์ฌ์ฉ์๊ฐ ๊ทธ ์ฐจ์ด๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ๋ณํ์ง ๋ชปํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ ์
๋๋ค.
[...]
์๋ฌ๋ ์์ง๋ง, ๋ฉ๋ชจ๋ฆฌ 10 bytes ๋ฅผ ์ธ๋ฐ์์ด ๋ญ๋นํ๋ ์ฝ๋์
๋๋ค.
๋์ด ์๋ฏธํ์๋ referencing ์ด ์ ํํ ๋ฌด์์ ์๋ฏธํ๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง,
์์ ๊ฐ์ ์ํฉ์์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ก์์ฃผ๋ ๊ฒ์ด ์๋ฌด๋ฐ ์ข์ ์๋ฏธ๋ฅผ ๊ฐ์ง
๋ชปํฉ๋๋ค.
>>
>> ๋ผ์ธ 1: char p1[10];
>> ๋ผ์ธ 2: char *p1;
>> p1 = malloc(10);
>>
>> ๋ผ์ธ 1๊ณผ ๋ผ์ธ 2๋ ๊ฐ์ ๋ง์ด์ฃ ? ๊ทธ๋ผ
>>
>> ๋ผ์ธ 3: char p2[];
>> ๋ผ์ธ 4: char *p2;
>>
>> ๋ผ์ธ 3๊ณผ ๋ผ์ธ 4๋ ๊ฐ์ ๋ง์ธ๊ฐ์?
>
>[์ง๋ฌธ2]
>์ ํํ ๊ฐ์ notation์
๋๋ค. ์ฆ *p2๋ p2[]๋ชจ๋ array์ ์ฒซ๋ฒ์งธ ์์ ๋ฒ์ง์๋ฅผ
>๋ํ๋
๋๋ค. Base๋๋๋ค.
๊ทธ๋ ์ง ์์ต๋๋ค. ๋ค๋ฅธ ๋ต๋ณ์์ ๋ค๋ฅธ ๋ถ์ด ์ถฉ๋ถํ ์ค๋ช
ํด ๋๋ ธ์ต๋๋ค. ๋ฌผ
๋ก , ๋ผ์ธ1๊ณผ ๋ผ์ธ2 ์ญ์ ๋ค๋ฅธ ๋ง์
๋๋ค.
[์ง๋ฌธ3 ์๋ต]
๋ฐฐ์ด๊ณผ ํฌ์ธํฐ๋ type ์์ฒด๊ฐ ๋ค๋ฆ
๋๋ค. ๋ฐ๋ผ์, ๋์ด C ์ธ์ด์ ๋ค๋ฅธ ๋ถ๋ถ
์ ์ ํํ๊ฒ ์ดํดํ๊ณ ๊ณ์๊ณ ๊ทธ ๋ด์ฉ๋ง์ ๊ทธ๋๋ก ์ ์ฉํ๋ค๋ฉด ํผ๋์ ์ฌ์ง
๊ฐ ์์ต๋๋ค. ์ด๋ณด๋ค์ด ๋ฐฐ์ด๊ณผ ํฌ์ธํฐ์ ๊ด๊ณ์ ๋ํด์ ์ด๋ ค์ ํ๋ ์ด์ ๋
๋ฐฐ์ด, ํฌ์ธํฐ ์์ฒด์ ๋ฌธ์ ๊ฐ ์๋๋ผ (์๋์ ์ ๊ฒ ์ง๋ง ๋ฐฐ์ด๊ณผ ํฌ์ธํฐ์ ๋ณ
ํ ๊ด๊ณ๋ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค) C ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ง์์ด ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ฐฐ์ด์ ๋๋ถ๋ถ์ ๋ฌธ๋งฅ์์ ๊ทธ ์ฒซ๋ฒ์งธ ์์๋ฅผ ๊ฐ๋ฅดํค๋ ํฌ์ธํฐ๋ก decay ํฉ๋
๋ค. ๋ํ ํ๋ฒ decay ํ ๋ฐฐ์ด์ ๋ค์๋ ๋ฐฐ์ด๋ก ๋์์ฌ ์ ์์ต๋๋ค. ์๋๋
๋ฐฐ์ด์ด ํฌ์ธํฐ๋ก ๋ณํ๋๋ ์ํฉ์ ๋ํ ์ค๋ช
์
๋๋ค.
array of type ์ sizeof, ๋จํญ & ์ฐ์ฐ์์ ํผ์ฐ์ฐ์์ธ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋
๊ทธ ์์์ค ์ฒซ๋ฒ์งธ๋ฅผ ๊ฐ๋ฅดํค๋ ํฌ์ธํฐ pointer to type ์ผ๋ก ๋ณํ๋ฉ๋๋ค.
(๋ํ, ๋ฌธ์๋ฐฐ์ด array of char ์ด๋ wide character ์ ๋ฐฐ์ด array of
wchar_t ๋ฅผ ์ด๊ธฐํํ๋ (wide) string literal ์ญ์ ํฌ์ธํฐ๋ก decay ํ์ง
์์ต๋๋ค - ์ ๊ฐ ๋ค๋ฅธ ๊ธ์์ string literal ์ด ๋ถ๋ช
๋ฐฐ์ด์ด๋ผ๊ณ ๋ง์๋
๋ ธ์ฃ ?)
๋ฐ๋ผ์, pointer to char ์ ํฌ๊ธฐ๊ฐ 4 bytes ๋ผ๊ณ ๊ฐ์ ํ๋ค๋ฉด, ๋ค์ ์์์
๊ฒฐ๊ณผ๋ ์ด๋ ์ต๋๋ค. (์ ์์ ์ค๋ช
์ ์ ์ฐธ๊ณ ํ์ญ์์)
char s[10];
sizeof(s); /* 10 */
sizeof(&s[0]); /* 4 */
sizeof(s+0); /* 4 */
sizeof(*&s); /* 10 */
C ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ํ ์ง์์ด ๋ถ์กฑํด์ ํผ๋ํ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด ๋ณด์ง์.
๋ฐฐ์ด์ incomplete type ์ ์์๋ก ๊ฐ์ง ์ ์์ต๋๋ค. ํ์ง๋ง ํฌ์ธํฐ๋ ๊ฐ
๋ฅด์ผ์ง๋ type ์ผ๋ก์ incomplete type ์ ๊ฐ์ง ์ ์์ง์. ๋ฐ๋ผ์,
struct foo; /* incomplete type */
typedef struct foo foo_type;
foo_type array[10]; /* invalid! */
foo_type *pointer; /* valid */
ํ์ง๋ง, ํจ์์ ๋งค๊ฐ๋ณ์ ์ ์ธ์์๋ "์ ํจํ" ๋ฐฐ์ดํ์ ํฌ์ธํฐํ์ผ๋ก ๋ค์
์ฐ์ฌ์ง๋๋ค (rewrite). ๋ฐ๋ผ์,
int func(char array[]);
int func(char *array);
int func(char array[10]);
int func(char array[20]);
์์ ๋ชจ๋ ํจ์์ํ์ ์ธ์ ํธํ๋๋ฉฐ ๊ฐ์ composite type ์ ๋ง๋ญ๋๋ค.
์ด์ธ์๋, ๋ง๋ค๋ ค๊ณ ๋ง์๋ง ๋จน์ผ๋ฉด ๋ช๊ฐ์ ์ํฉ์ด๋ผ๋ ๊ฐ๋ฅํฉ๋๋ค. ๋ฌธ์ ๋
์ด๋ฌํ ๊ฒ๋ค์ case by case ๋ก ํด๊ฒฐํ๋ ค๊ณ ํด์๋ ์๋๋ค๋ ๊ฒ์
๋๋ค. (์ด
์ด์ผ๊ธฐ๋ ํจ์ํ๊ณผ ํจ์ ํฌ์ธํฐ์ ๋ํ ์ค๋ช
์ ํ๋ฉด์๋ ๋์๋ ๋ง์ธ ๊ฒ ๊ฐ
๊ตฐ์) C type ์ฒด๊ณ์ ๋ํ ์ ์ฒด์ ์ธ ์ดํด์ ๋ฐฐ์ด๊ณผ ํฌ์ธํฐ์ ์ ํํ type
๊ตฌ๋ถ๋ง ์ด๋ฃจ์ด์ง๋ค๋ฉด, ์์ ๊ฐ์ ์ํฉ์ "์ผ์ ํ์กฐ๊ฐ" ^^ ์
๋๋ค.
>
>์ด๋ป๊ฒ ๊ณต๋ถํ์๋์? ์์ค์ ๋์จ ์ผ๋ฐ์ ์ธ C ์ฑ
์๋ ์ ์ ๋ฌผ์์ ๋๋ตํด ์ค ์
>์๋
>์ฑ
์ ๋ณด์ง ๋ชปํ์ต๋๋ค. (๋ฌผ๋ก ์ ๊ฐ ์ฐพ์ง ๋ชปํด์ ๊ทธ๋ด์๋ ์์ง๋ง.. ^^;;)
์, ๋์ด ์ฐพ์ง ๋ชปํ ๊ฒ์ด์ง์. :)
๋๋ถ๋ถ์ ์ฑ
๋ค ์ญ์ ์ด์คํ๊ฒ ๊ณต๋ถํ ์ฌ๋๋ค์ด ์จ๋ด์ ๊ทธ๋ ์ต๋๋ค.
>
>C์ธ์ด ํ์ค ๋ฌธ์ ๊ฐ์ ๊ฒ๋ค์ ๋ณด์๋ฉด์ ์ต๋ํ์ ๊ฑด๊ฐ์?
>
C ํ์ค ๋ฌธ์๋ ๋ฌผ๋ก ์ด๋ฅผ ๊ฐ์ฅ ๋ช
ํํ๊ฒ ์ ์ํ๊ณ ์์ง๋ง, ๋งค์ฐ ๊ธฐ์ ์ ์ธ
๋ฌธ์์ด๊ธฐ ๋๋ฌธ์, ๋จ์ํ ๋ฐฐ์ด๊ณผ ํฌ์ธํฐ์ ๊ด๊ณ๋ง์ ํ์ตํ๊ธฐ ์ํด ํด์ํ
๊ธฐ ์ด๋ ต๊ณ ๋ด์ฉ๋ ๋ฐฉ๋ํ ํ์ค์ ๋ณธ๋ค๋ ๊ฒ์ ๋ญ๋น์ผ ์ ์์ต๋๋ค. ์๋๋
comp.lang.c ๊ทธ๋ฃน์ ๊ณต์ FAQ (์์ฃผ ๋ฌผ์ด๋ณด๋ ์ง๋ฌธ๋ค) ์
๋๋ค. ๋ด์ฉ์ค ๋์ด
๊ถ๊ธํด ํ์๋ ๋ฐฐ์ด๊ณผ ํฌ์ธํฐ์ ๊ด๊ณ์ ๋ํด์ ๋ค๋ฃฌ ๋ถ๋ถ์ด ์์ต๋๋ค. ์ฐธ๊ณ
ํ์๊ธฐ ๋ฐ๋๋๋ค. (๋ฌผ๋ก , ์๋ฌธ์
๋๋ค. ํ๊ธ ๋ฒ์ ผ๋ ์์ง๋ง, ์ ๋ ์ถ์ฒํ์ง
๋ ์์ต๋๋ค - ๋ณด๊ณ ์๋ณด๊ณ ๋ ์์ ๊ฒ ์ง๋ง...)
http://www.eskimo.com/~scs/C-faq/top.html
๊ทธ๋ผ...
[์ง๋ฌธ 1]๊ณผ ๊ด๊ณ๋ ๋ง๋ค
> ๋ผ์ธ 1: char *p1 = "1234567890";
>
> ๋ผ์ธ 2: char *p1;
> p1 = malloc( 10 );
> p1 = "1234567890";
๊ทธ๋ ์ต๋๋ค. ์ ๋๋ก ์๋ฌ๊ฐ ๋์ง ์์ต๋๋ค. ์ด๊ฑด String์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ
๊ฒ์
๋๋ค. ๊ทธ๋ฆผ์ ๊ทธ๋ ค๋ณด์๋ฉด ์ฝ๊ฒ ์์ค ๊ฒ๋๋ค.
(๊ทธ๋ฆผ์ ์์คํค๋ก........... --; ์๋ต)
๊ทธ๋ฐ๋ฐ... ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ์๋ฉด์๋ ์ค์ ํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์
๋๋ค.
[error code]
int *p1;
*p1=100;
๊ฐ์ฅ ์ํํ๋ฉด์๋ ๋น ์ง๊ธฐ ์ฌ์ด ์ค๋ฅ... ์ด๊ฑธ ๊ทธ๋ฆผ์ผ๋ก.............ํ ๊น๋?
์................ ์ฃ์ก...
๊ทธ๋ฆผ์ด ํ๋ ๊ด๊ณ๋ก ๋ฐ๋ฅธ ์ฝ๋๋ฅผ ์จ๋ณด๊ฒ ์ต๋๋ค. ์ฃ์ก
[correct code]
int x, *p1;
p&=x; file://memory allocation
*p=100;
์ด์๊ฐ์ธ ์ฃผ์๋ฅผ referencingํ ํ ๊ฐ์ ์ง์ด๋ฃ์ด์ฃผ๋ ์ต๊ด์ ๊ธธ๋ฌ์ฃผ์ญ์์ค.
[์ง๋ฌธ 2]์ ๊ด๊ณ๋ ๋ง๋ค
C์์ ์ง์ํ๋ SemiDynamic Array - int p[]-๋ฅผ ์ด๋ป๊ฒ ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ป๊ฒ
์ธ์ํ ๊น์?
๊ทธ๋ ์ต๋๋ค. ์ปดํ์ผ๋ฌ๋ ์๋ฌด์๊ฐ์์ด int p[]๋ฅผ int *p ์ ์ธ์ผ๋ก ๋ณ๊ฒฝํฉ๋๋ค.
(์ด๋ค ์ฑ
์ ์ฐธ์กฐํ์
๋ ๋ ๊ฒ๋๋ค. Neill Graham์ด ์ด ์ฑ
์ ๋ณด์ญ์์ค). ๋ฐ๋ผ์ int
p[]๋ int *p๋ ๊ฐ์ ๋ง์
๋๋ค.
์ฌ์ค incomplete array type ๋น์์ฑ ๋ฐฐ์ด(?)์ด๋ผ๋ ๊ฒ์ ๊ทธ ์์ ์์๋ Array๊ฐ
์๋๋ผ๋ ๊ฒ์ ์ฃผ์ํ์ญ์์ค. ์ ๋ ๋ฐฐ์ด์ด ๋ ์์ ์์ ๋๋ฆฐ ์ด์ผ๊ธฐ๊ฐ ์๋๋๋ค.
์ ๋ ๊ณต๋ถํ๋ ์๋ฏธ์์ array์ pointer๊ฐ ๊ฐ์ ๋์ ๋ค๋ฅผ ๋๋ฅผ ์ ๋ฆฌํด ๋ณด๋๋ก
ํ๊ฒ ์ต๋๋ค.
- array์ pointer๊ฐ ๊ฐ์ ๊ฒฝ์ฐ
1. expression ์์ array ์ด๋ฆ์ ๊ทธ array์ ์ฒซ๋ฒ์งธ ํญ๋ชฉ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ก
์ทจ๊ธ๋๋ค.
์1)
int a[10], *p;
p = a;
2. array์ ์ฒจ์(subscript)๋ ํฌ์ธํฐ ์คํ์ ๊ณผ ๋์ผํ๋ค.
์2)
int a[10], *p, i;
p = a;
for (i = 0; i < 10; i++) a[i] = 0;
for (i = 0; i < 10; i++) p[i] = 0;
for (i = 0; i < 10; i++) *(p+i) = 0;
for (i = 0; i < 10; i++) *p++ = 0;
์์ ์๋ ๋ค๊ฐ์ for ๋ฌธ์ ๋ชจ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. (๋ฌผ๋ก ์ปดํ์ผ๋ฌ๊ฐ
๋ง๋ ์ฝ๋๋ ๋ค๋ฅผ ์ ์์ต๋๋ค๋ง)
3. ํจ์์ ์ธ์๋ก ์ ์ธ๋ array ์ด๋ฆ์ ๊ทธ array์ ์ฒซ๋ฒ์งธ ํญ๋ชฉ์ ๊ฐ๋ฆฌํค๋
ํฌ์ธํฐ๋ก ์ทจ๊ธ๋๋ค.
์3)
void func(int *para) {}
void func(int para[]) {}
void func(int para[100]) {}
์ธ๊ฐ์ ํจ์ ์ ์ ๋ชจ๋๊ฐ ๋์ผํฉ๋๋ค.
- array์ pointer๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ
์๋ type ์์ฒด๊ฐ ํ๋ฆฌ๋ฏ๋ก ์์ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ๋์ ์๋ก ๋ค๋ฅธ ๊ฒ์
๋๋ค๋ง,
(๋ฌผ๋ก ํ์ค์์๋ ์์ ๊ฒฝ์ฐ๋ค์ด ๋๋ถ๋ถ์ด์ง๋ง ^^) ๊ฐ์ฅ ๋ง์ด ํ๋ฆฌ๋ ๋ถ๋ถ๋ง ์ข
์ ์ด๋ณด๋ก ํ๊ฒ ์ต๋๋ค.
1. array ์ด๋ฆ์ l-value๊ฐ ๋ ์ ์์ง๋ง unmodifiable์ด๋ค.
์4)
int a[10], *p;
a = p; /* ์ด๋ฐ ์ผ์ ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. */
2. referencing
์ด๋ ์ด์ ์์น๋ ์ปดํ์ผ์ ํ ๋ ๊ฒฐ์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ด๋ ์ด์ ์ด๋ค ์์๋ฅผ
์ฝ์ด์ค๊ธฐ ์ํด ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ ์ด ์์น๋ฅผ ๊ฐ์ ธ์ฌ ํ์๊ฐ ์์ต๋๋ค. ํ์ง๋ง
ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ์๊ธฐ ์ํด์๋ indirect referencing์ ํด์ผํฉ๋๋ค.
์5)
char a[10] = "123456789";
char *p = "123456789";
char c;
(5-1) c = p[4];
(5-2) c = a[4];
(5-1)์ ๊ฒฝ์ฐ์๋ ์ปดํ์ผ๋ฌ๋ p์ ์์น๋ง์ ์๊ณ ์์ต๋๋ค. (์๋ฅผ ๋ค์ด
4000๋ฒ์ง๋ผ๊ณ ํ์ง์) 1) ๋จผ์ 4000 ๋ฒ์ง์ ์ ์ฅ๋ ๊ฐ์ ์ฝ์ด์ต๋๋ค. ์ด ๊ฐ์ ์ด
ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ ์์น์
๋๋ค. (์๋ฅผ ๋ค์ด 5000๋ฒ์ง๋ผ๊ณ ํ์ง์) 2)
๋ค์์ผ๋ก 5000์ 4๋ฅผ ๋ํด 5004๋ฅผ ๋ง๋ค๊ณ , 3) ๋ง์ง๋ง์ผ๋ก 5004 ๋ฒ์ง์ ์ ์ฅ๋
๊ฐ์ ์ฝ์ด๋ค c์ ๋ฃ์ต๋๋ค.
(5-2)์ ๊ฒฝ์ฐ์๋ ์ปดํ์ผ๋ฌ๊ฐ a์ ์์น๋ฅผ ์๊ณ ์์ต๋๋ค. (์๋ฅผ ๋ค์ด
4500๋ฒ์ง๋ผ๊ณ ํ์ง์) 1) 4500์ 4๋ฅผ ๋ํด 4504๋ฅผ ๋ง๋ค๊ณ , 2) 4504 ๋ฒ์ง์ ์๋
๊ฐ์ ์ฝ์ด๋ค c์ ๋ฃ์ต๋๋ค.
์ด๋ฐ ๋ ํผ๋ฐ์ฑ์ ์ฐจ์ด๋ก ์ธํด์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ ์คํ์ ์ค๋ฅ๋ฅผ ๋ด๊ฒ ๋ฉ๋๋ค.
์6)
file A:
int a[10];
file B:
extern int *a;
int c;
c = a[10];
>
> ----
>
> ๊ธ๊ตฌ ์ ๋ ์๋นํ ์ค๋๊ธฐ๊ฐ(์ง์ฅ์ ์๋ค๋
์ง๋ง) ํ๋ก๊ทธ๋จ์ ๊ณต๋ถํ๋ค๊ณ
> ์๊ฐํ๋๋ฐ
>
> ์์ง๋ ์ด๋ฐ ๋ฌธ์ ์ ๋ถ๋ซํ๋ฉด ๋จธ๊ฐ๋จผ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋์ ๋๋์ฒด C์ธ์ด๋ฅผ
>
> ์ด๋ป๊ฒ ๊ณต๋ถํ์๋์? ์์ค์ ๋์จ ์ผ๋ฐ์ ์ธ C ์ฑ
์๋ ์ ์ ๋ฌผ์์ ๋๋ตํด ์ค
์
> ์๋
>
> ์ฑ
์ ๋ณด์ง ๋ชปํ์ต๋๋ค. (๋ฌผ๋ก ์ ๊ฐ ์ฐพ์ง ๋ชปํด์ ๊ทธ๋ด์๋ ์์ง๋ง.. ^^;;)
>
> C์ธ์ด ํ์ค ๋ฌธ์ ๊ฐ์ ๊ฒ๋ค์ ๋ณด์๋ฉด์ ์ต๋ํ์ ๊ฑด๊ฐ์?
>
>
ํ์ค ๋ฌธ์๋ฅผ ๋ณด๋ ๊ฒ ๋ณด๋ค๋ ์ ๋ ์ฑ
์ ๋ณด์๋๊ฒ ๋ ๋ณ์ ๊ฑฐ ๊ฐ์ต๋๋ค. ํ์ค
๋ฌธ์๋ผ๋ ๊ฒ ๋ฌด์จ ๋ฒ์ ๊ฐ์ ๊ฒ์ด๋ผ ๋ฑ๋ฑํ๊ณ ์ฌ๋ฏธ์๊ณ ์ดํดํ๊ธฐ๋ ์ด๋ ต๊ฑฐ๋ ์.
์๋ง๋ ์ปดํ์ผ๋ฌ๋ฅผ ๋ง๋ค๊ฑฐ๋ ์ธ์ด์ ์์ฃผ ๊ด์ฌ์ด ๋ง์ ์ฌ๋๋ค์ด๋ ๋ณด๋ ๊ฒ
์๋๊น์? ์ ์๊ฐ์ ๋ฌด์จ ๋ง๋ฒ๊ณผ ๊ฐ์ ์ฑ
์ด ์์ด์ ๋๊ป์ ๊ถ๊ธํด ํ์๋ ๊ฑธ ๋ค
์ค๋ช
ํด ์ค ์๋ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ง์ ๋ถ๋ค์ด ์ถ์ฒํ์๋ ์ข์ ์ฑ
์ ์ฝ์ด
์ํํ์๊ณ , ๊ฑฐ๊ธฐ์ ์ค๋ช
์ด ์๋ ๊ฒ์ ๊ณ ๋ฏผํ๊ณ ๋ฌผ์ด๋ณด์๋ ๊ฒ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ผ
๊ฑฐ๋ผ ์๊ฐํฉ๋๋ค.
์์์ ๋ง์ํ์ ๊ฒ์ function์ formal parameter๋ก ์ฌ์ฉ๋ ๋๋ง ์ฐธ์ ๋๋ค.
> ์ฌ์ค incomplete array type ๋น์์ฑ ๋ฐฐ์ด(?)์ด๋ผ๋ ๊ฒ์ ๊ทธ ์์ ์์๋ Array๊ฐ
> ์๋๋ผ๋ ๊ฒ์ ์ฃผ์ํ์ญ์์ค. ์ ๋ ๋ฐฐ์ด์ด ๋ ์์ ์์ ๋๋ฆฐ ์ด์ผ๊ธฐ๊ฐ
์๋๋๋ค.
array ์ด๋ฆ์ด pointer๋ก ์ฐ์ผ ์๋ ์์ง๋ง, ์ด๋ ๊ฒ ํ ๋ฒ ๋ฐ๋๊ณ ๋๋ฉด ๋ค์
array๋ก ๋์์ฌ ์ ์์ง ์์ต๋๊น? incomplete array๊ฐ pointer๋ก ๋ณํํ์๋ค๊ฐ,
๋ค์ ์ด๋์์ ์ array๊ฐ ๋๋ค๋ ๊ฒ์ ์ดํดํ๊ธฐ ์ด๋ ค์ด ๋ง์์ด๊ตฐ์. ์ข ๋ ์ค๋ช
์ด
ํ์ํ์ง ์์๊น์?
C ์๋ SemiDynamic Array ๋ผ๋ ๊ฒ์ด ์์ต๋๋ค. ํน์ implementation ์์
ํ์ฅ์ผ๋ก ์ง์ํ๋ ๊ฒ์ผ ๋ฟ์
๋๋ค. ํ์ค C ์์ int p[] ๋ incomplete type
์ ๊ฐ๋ ๋ฐฐ์ด์ผ ๋ฟ์
๋๋ค.
>๊ทธ๋ ์ต๋๋ค. ์ปดํ์ผ๋ฌ๋ ์๋ฌด์๊ฐ์์ด int p[]๋ฅผ int *p ์ ์ธ์ผ๋ก ๋ณ๊ฒฝํฉ๋๋ค.
์ ๋๋ก ๊ทธ๋ ์ง ์์ต๋๋ค. ํน์ implementation ์ ํ์ฅ์ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ก
๊ธฐ์ ํ์ง ๋ง์ญ์์ค.
>(์ด๋ค ์ฑ
์ ์ฐธ์กฐํ์
๋ ๋ ๊ฒ๋๋ค. Neill Graham์ด ์ด ์ฑ
์ ๋ณด์ญ์์ค). ๋ฐ๋ผ์ int
>p[]๋ int *p๋ ๊ฐ์ ๋ง์
๋๋ค.
์ ๋๋ก ๊ทธ๋ ์ง ์์ต๋๋ค. ์ ์๋ ์ด์ ๊ด๋ จํด ์ด๋ฏธ ๋ง์ ๋ถ๋ค์ด ๊ทธ๋ ์ง
์๋ค๊ณ ์ด์ฌํ ์ค๋ช
ํ์ต๋๋ค. ๋ค์ ์ฝ์ด๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
>์ฌ์ค incomplete array type ๋น์์ฑ ๋ฐฐ์ด(?)์ด๋ผ๋ ๊ฒ์ ๊ทธ ์์ ์์๋ Array๊ฐ
>์๋๋ผ๋ ๊ฒ์ ์ฃผ์ํ์ญ์์ค. ์ ๋ ๋ฐฐ์ด์ด ๋ ์์ ์์ ๋๋ฆฐ ์ด์ผ๊ธฐ๊ฐ ์๋๋๋ค.
>
๊ทธ ์์ ์์๋ ๋ฐฐ์ด์
๋๋ค. ์ฆ incomplete type ์ด๊ธฐ ๋๋ฌธ์ ๊ตฌ์ฒด์ ํฌ๊ธฐ๋ฅผ
ํ์๋ก ํ์ง ์๋ ๋ชจ๋ ๊ณณ์์ ๋ฐฐ์ด๋ก์ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค. (C ์์๋ ์ฒจ
์์ฐ์ฐ ์ญ์ ํฌ์ธํฐ๋ก ์ ์๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํฉ๋๋ค)
์ ์๊ฐ์ ๋์ C ์ ํน์ ํ์ฅ์ผ๋ก ์ธํด ํ์ค C ์ ์ฌ๋ฐ๋ฅธ ์ ์์
semantic ์ ๋ฐ์๋ค์ด์ง ๋ชปํ๊ณ ๊ณ์ ๋ฏ ํฉ๋๋ค. ํ์ฅ์ด ์๋, ํ์ค C ์ธ์ด
๋ฅผ ๊ธฐ์ ํ ์ฑ
์ผ๋ก ๋ฐฐ์ด๊ณผ ํฌ์ธํฐ์ ๊ด๊ณ๋ฅผ ๋ช
ํํ ํ์๋ ๊ฒ์ด ์ข์ ๋ฏ
์ถ์ต๋๋ค. (clc FAQs ๋ฅผ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค)
ebazy ๋์ ํน์ implementation ์ ํ์ฅ์ผ๋ก ์ธํด incomplete array ์ ๋
ํด์ ์คํด๋ฅผ ํ๊ณ ๊ณ์ญ๋๋ค. ํ์ค C ์ธ์ด๋ฅผ ์๊ฐํ๋ค๋ฉด ์ฌ๋ฐ๋ฅธ ์ค๋ช
์ด ์๋
๋๋ค.
๊ทธ๋ฆฌ๊ณ , C99 ํ์ค์์๋ C90 ๊ณผ๋ ๋ฌ๋ฆฌ variable-size array ๋ผ๋ ๊ฒ์ ์ง
์ํฉ๋๋ค. ์ด๋ ๊ฐ๋
์ ebazy ๋์ SemiDynamic array ํ๊ณ ์ ์ฌํ ์ง ๋ชจ๋ฅด
์ง๋ง, ๊ทธ ์ ์ธ๋ฐฉ๋ฒ๊ณผ ์ ์๋ ํ๋์ ๊ฒฉ์ด ์์ ํ ๋ค๋ฆ
๋๋ค.
>์ ๋ ๊ณต๋ถํ๋ ์๋ฏธ์์ array์ pointer๊ฐ ๊ฐ์ ๋์ ๋ค๋ฅผ ๋๋ฅผ ์ ๋ฆฌํด ๋ณด๋๋ก
>ํ๊ฒ ์ต๋๋ค.
>
>- array์ pointer๊ฐ ๊ฐ์ ๊ฒฝ์ฐ
>
>1. expression ์์ array ์ด๋ฆ์ ๊ทธ array์ ์ฒซ๋ฒ์งธ ํญ๋ชฉ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ก
>์ทจ๊ธ๋๋ค.
๋ฌผ๋ก sizeof ์ฐ์ฐ์๋ ๋จํญ & ์ฐ์ฐ์์ ํผ์ฐ์ฐ์์ธ ๊ฒฝ์ฐ์๋ decay ํ์ง ์
์ต๋๋ค.
>
>์1)
>
>int a[10], *p;
>p = a;
>
>2. array์ ์ฒจ์(subscript)๋ ํฌ์ธํฐ ์คํ์
๊ณผ ๋์ผํ๋ค.
a[i] ๋ ์ ์ ์์ฒด๊ฐ *((p)+(i)) ์
๋๋ค. ํฌ์ธํฐ ์คํ์
์ด๋ ๊ฒฐ๊ตญ ๋์์ฒด
ํฌ์ธํฐ (pointer to object type) ์ ์ ์์ +, - ์ฐ์ฐ์
๋๋ค. ๋ฌผ๋ก ๋ฐฐ์ด
์ฒจ์ ์ญ์ (๋จ์ํ ์ค๋ช
์ด ์๋) ์ธ์ด์ ์ ์ ์์ฒด๊ฐ ํฌ์ธํฐ ์ฐ์ฐ์ผ๋ก ์ ์
๋๊ธฐ์ ๋ ์ฌ์ด์ ๊ตฌ๋ถ์ ์ ํ ํ์์์ต๋๋ค. - ๋ค๋ง ํ๋ก๊ทธ๋๋จธ์ ์๋๋ฅผ
ํํํ๋ ๋ฐ ํ์ํ ๋ฟ์
๋๋ค.
>์2)
>
>int a[10], *p, i;
>p = a;
>
>for (i = 0; i < 10; i++) a[i] = 0;
>for (i = 0; i < 10; i++) p[i] = 0;
>for (i = 0; i < 10; i++) *(p+i) = 0;
>for (i = 0; i < 10; i++) *p++ = 0;
>
>์์ ์๋ ๋ค๊ฐ์ for ๋ฌธ์ ๋ชจ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. (๋ฌผ๋ก ์ปดํ์ผ๋ฌ๊ฐ
>๋ง๋ ์ฝ๋๋ ๋ค๋ฅผ ์ ์์ต๋๋ค๋ง)
C ์ ์ธ์ด์ ์ ์๋ actual machine ์ด ์๋ abstract machine ์ด๋ฏ๋ก, ์ปด
ํ์ผ๋ฌ๊ฐ ๋ง๋๋ ์ฝ๋๋ (C ์ธ์ด์ ์
์ฅ์์๋) ์ค์ํ์ง ์์ต๋๋ค. ๋ค๋ง
๊ทธ๋ฌํ ์ ์๊ฐ ์๊ตฌํ๋ ํ๋์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ฒ๋ผ (as if) ํด์ฃผ๊ธฐ๋ง ํ๋ฉด
๋๋ ๊ฒ์
๋๋ค.
๋ํ ์์ 4๊ฐ์ for ๋ฌธ์ค ๋ง์ง๋ง for ๋ฌธ์ ์์ 3๊ฐ์ ๊ฒฐ๊ณผ๋ก ๋์ค๋ ํ๋
์ด ๋ค๋ฆ
๋๋ค. (p ์ ๊ฐ์ด ๋ณํ๊ฒ ์ง์)
>3. ํจ์์ ์ธ์๋ก ์ ์ธ๋ array ์ด๋ฆ์ ๊ทธ array์ ์ฒซ๋ฒ์งธ ํญ๋ชฉ์ ๊ฐ๋ฆฌํค๋
>ํฌ์ธํฐ๋ก ์ทจ๊ธ๋๋ค.
์๋ ์ค๋ช
์ ๋ง๋ ๋ง์ด์ง๋ง, ์ด ์ค๋ช
์ ์กฐ๊ธ ํ๋ฆฝ๋๋ค. ๋งค๊ฐ๋ณ์ ์ ์ธ์ ์ด
๋๊น์ง๋ ๋ช
์นญ์ ๋ํ type ์ ์ ์ธ์
๋๋ค. ์ ์ธ์์ ์ฒซ๋ฒ์งธ ์์๋ฅผ ๊ฐ๋ฅดํค
๊ณ ์ ๊ฐ๋ฅดํค๊ณ ๋ฑ์ ๋ฌธ์ ๋ ์๊ด์ด ์์ต๋๋ค. ์ข ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ค๋ช
ํ์๋ฉด,
"ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ ์ธ๋ "์ฌ๋ฐ๋ฅธ" (-> ์๊พธ ๊ฐ์กฐํ๋ ์ด์ ๋ฅผ ์์๊ฒ ์ต๋
๊น?) ๋ฐฐ์ดํ (array of type) ์ ๋งค๊ฐ๋ณ์๋ ํฌ์ธํฐํ (pointer to type)
์ผ๋ก ๋ค์ ์ฐ์ฌ์ง๋๋ค (rewrite)." ๊ฒ ์ง์.
>์3)
>
>void func(int *para) {}
>void func(int para[]) {}
>void func(int para[100]) {}
>
>์ธ๊ฐ์ ํจ์ ์ ์ ๋ชจ๋๊ฐ ๋์ผํฉ๋๋ค.
>
>- array์ pointer๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ
>
>์๋ type ์์ฒด๊ฐ ํ๋ฆฌ๋ฏ๋ก ์์ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ๋์ ์๋ก ๋ค๋ฅธ ๊ฒ์
๋๋ค๋ง,
>(๋ฌผ๋ก ํ์ค์์๋ ์์ ๊ฒฝ์ฐ๋ค์ด ๋๋ถ๋ถ์ด์ง๋ง ^^) ๊ฐ์ฅ ๋ง์ด ํ๋ฆฌ๋ ๋ถ๋ถ๋ง ์ข
>์ ์ด๋ณด๋ก ํ๊ฒ ์ต๋๋ค.
>
>1. array ์ด๋ฆ์ l-value๊ฐ ๋ ์ ์์ง๋ง unmodifiable์ด๋ค.
ํ์ค์ ์ด๋ฅผ lvalue ์ modifiable lvalue ๋ก ๊ตฌ๋ถํ๊ณ ์์ต๋๋ค.
>์4)
>
>int a[10], *p;
>a = p; /* ์ด๋ฐ ์ผ์ ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. */
>
>2. referencing
>
>์ด๋ ์ด์ ์์น๋ ์ปดํ์ผ์ ํ ๋ ๊ฒฐ์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ด๋ ์ด์ ์ด๋ค ์์๋ฅผ
>์ฝ์ด์ค๊ธฐ ์ํด ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ ์ด ์์น๋ฅผ ๊ฐ์ ธ์ฌ ํ์๊ฐ ์์ต๋๋ค. ํ์ง๋ง
>ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ์๊ธฐ ์ํด์๋ indirect referencing์ ํด์ผํฉ๋๋ค.
์ด ๋ด์ฉ์ C ์ธ์ด๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ๋ ๋ฎ์ ๋ ๋ฒจ์์ ํ ๋ก ๋ ๋ด์ฉ์
๋
๋ค. ์ธ์ด์ ์ถ์์ ์ ์์ธ C ์ธ์ด์ ์ ์๋ ๋ฐฐ์ด์ ์์น๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฑ์
ํ๋์ ์ ์ํ๊ณ ์์ง ์์ต๋๋ค. ์ด๋๊น์ง๋ type ์ ๋ง๋ ์์์ ํ๊ฐ์
side effect ๋ฑ์ด ์์ ๋ฟ์
๋๋ค.
๋ํ, ์ ์ ๊ธฐ์ต๋ถ๋ฅ๋ฅผ ๊ฐ๋ ๋ฐฐ์ด์ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ ํ ์คํ๋์ ์ฃผ์์์
(address constant) ๋จ๊ฒ ๋์ง๋ง, ์๋ ๊ธฐ์ต๋ถ๋ฅ๋ฅผ ๊ฐ๋ ๋ฐฐ์ด์ ๊ทธ๋ ์ง ์
์ง์.
[...]
>
>์ด๋ฐ ๋ ํผ๋ฐ์ฑ์ ์ฐจ์ด๋ก ์ธํด์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ ์คํ์ ์ค๋ฅ๋ฅผ ๋ด๊ฒ ๋ฉ๋๋ค.
>
>์6)
>
>file A:
> int a[10];
>
>file B:
> extern int *a;
> int c;
> c = a[10];
C ์ธ์ด๋ ์ด ํ๋ก๊ทธ๋จ์ ์ค๋ฅ๋ฅผ ๊ทธ๋ฐ์์ผ๋ก ํด์ํ์ง ์์ต๋๋ค. ์์ ํ๋ก
๊ทธ๋จ์ด undefined behavior ๋ฅผ ๊ฐ๋ ์ด์ ๋ ๋์์ฒด (object) ๋ฅผ ์ํ ๋ช
์นญ
์ธ a ์ type ์ด ํธํ๋๋๋ก ์ ์ธ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ํ B ์์
์ฌ๋ฐ๋ฅด๊ฒ a[10] ์ผ๋ก ์ ์ธ๋๋ค๊ณ ํ๋๋ผ๋ ๋ฐฐ์ด์ ๋ง์ง๋ง ์์ ๋ค์์
dereferencing ํ๋ ํ๋์ undefined behavior ์
๋๋ค.
[...]
>
>ํ์ค ๋ฌธ์๋ฅผ ๋ณด๋ ๊ฒ ๋ณด๋ค๋ ์ ๋ ์ฑ
์ ๋ณด์๋๊ฒ ๋ ๋ณ์ ๊ฑฐ ๊ฐ์ต๋๋ค.
ํ์ค๋ฌธ์๋ณด๋ค ๋ ์๋ ์ฑ ์ด ์์ต๋๊น? :) (๋๋ด์ ๋๋ค)
>์ ๋ ๊ณต๋ถํ๋ ์๋ฏธ์์ array์ pointer๊ฐ ๊ฐ์ ๋์ ๋ค๋ฅผ ๋๋ฅผ ์ ๋ฆฌํด ๋ณด๋๋ก
>ํ๊ฒ ์ต๋๋ค.
>
>- array์ pointer๊ฐ ๊ฐ์ ๊ฒฝ์ฐ
>
>1. expression ์์ array ์ด๋ฆ์ ๊ทธ array์ ์ฒซ๋ฒ์งธ ํญ๋ชฉ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ก
>์ทจ๊ธ๋๋ค.
๋ฌผ๋ก sizeof ์ฐ์ฐ์๋ ๋จํญ & ์ฐ์ฐ์์ ํผ์ฐ์ฐ์์ธ ๊ฒฝ์ฐ์๋ decay ํ์ง ์
์ต๋๋ค.
>
>์1)
>
>int a[10], *p;
>p = a;
>
>2. array์ ์ฒจ์(subscript)๋ ํฌ์ธํฐ ์คํ์
๊ณผ ๋์ผํ๋ค.
a[i] ๋ ์ ์ ์์ฒด๊ฐ *((p)+(i)) ์ ๋๋ค. ํฌ์ธํฐ ์คํ์ ์ด๋ ๊ฒฐ๊ตญ ๋์์ฒด
ํฌ์ธํฐ (pointer to object type) ์ ์ ์์ +, - ์ฐ์ฐ์
๋๋ค. ๋ฌผ๋ก ๋ฐฐ์ด
์ฒจ์ ์ญ์ (๋จ์ํ ์ค๋ช
์ด ์๋) ์ธ์ด์ ์ ์ ์์ฒด๊ฐ ํฌ์ธํฐ ์ฐ์ฐ์ผ๋ก ์ ์
๋๊ธฐ์ ๋ ์ฌ์ด์ ๊ตฌ๋ถ์ ์ ํ ํ์์์ต๋๋ค. - ๋ค๋ง ํ๋ก๊ทธ๋๋จธ์ ์๋๋ฅผ
ํํํ๋ ๋ฐ ํ์ํ ๋ฟ์
๋๋ค.
>์2)
>
>int a[10], *p, i;
>p = a;
>
>for (i = 0; i < 10; i++) a[i] = 0;
>for (i = 0; i < 10; i++) p[i] = 0;
>for (i = 0; i < 10; i++) *(p+i) = 0;
>for (i = 0; i < 10; i++) *p++ = 0;
>
>์์ ์๋ ๋ค๊ฐ์ for ๋ฌธ์ ๋ชจ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. (๋ฌผ๋ก ์ปดํ์ผ๋ฌ๊ฐ
>๋ง๋ ์ฝ๋๋ ๋ค๋ฅผ ์ ์์ต๋๋ค๋ง)
C ์ ์ธ์ด์ ์ ์๋ actual machine ์ด ์๋ abstract machine ์ด๋ฏ๋ก, ์ปด
ํ์ผ๋ฌ๊ฐ ๋ง๋๋ ์ฝ๋๋ (C ์ธ์ด์ ์
์ฅ์์๋) ์ค์ํ์ง ์์ต๋๋ค. ๋ค๋ง
๊ทธ๋ฌํ ์ ์๊ฐ ์๊ตฌํ๋ ํ๋์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ฒ๋ผ (as if) ํด์ฃผ๊ธฐ๋ง ํ๋ฉด
๋๋ ๊ฒ์
๋๋ค.
๋ํ ์์ 4๊ฐ์ for ๋ฌธ์ค ๋ง์ง๋ง for ๋ฌธ์ ์์ 3๊ฐ์ ๊ฒฐ๊ณผ๋ก ๋์ค๋ ํ๋
์ด ๋ค๋ฆ
๋๋ค. (p ์ ๊ฐ์ด ๋ณํ๊ฒ ์ง์)
>3. ํจ์์ ์ธ์๋ก ์ ์ธ๋ array ์ด๋ฆ์ ๊ทธ array์ ์ฒซ๋ฒ์งธ ํญ๋ชฉ์ ๊ฐ๋ฆฌํค๋
>ํฌ์ธํฐ๋ก ์ทจ๊ธ๋๋ค.
์๋ ์ค๋ช ์ ๋ง๋ ๋ง์ด์ง๋ง, ์ด ์ค๋ช ์ ์กฐ๊ธ ํ๋ฆฝ๋๋ค. ๋งค๊ฐ๋ณ์ ์ ์ธ์ ์ด
๋๊น์ง๋ ๋ช
์นญ์ ๋ํ type ์ ์ ์ธ์
๋๋ค. ์ ์ธ์์ ์ฒซ๋ฒ์งธ ์์๋ฅผ ๊ฐ๋ฅดํค
๊ณ ์ ๊ฐ๋ฅดํค๊ณ ๋ฑ์ ๋ฌธ์ ๋ ์๊ด์ด ์์ต๋๋ค. ์ข ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ค๋ช
ํ์๋ฉด,
"ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ ์ธ๋ "์ฌ๋ฐ๋ฅธ" (-> ์๊พธ ๊ฐ์กฐํ๋ ์ด์ ๋ฅผ ์์๊ฒ ์ต๋
๊น?) ๋ฐฐ์ดํ (array of type) ์ ๋งค๊ฐ๋ณ์๋ ํฌ์ธํฐํ (pointer to type)
์ผ๋ก ๋ค์ ์ฐ์ฌ์ง๋๋ค (rewrite)." ๊ฒ ์ง์.
>์3)
>
>void func(int *para) {}
>void func(int para[]) {}
>void func(int para[100]) {}
>
>์ธ๊ฐ์ ํจ์ ์ ์ ๋ชจ๋๊ฐ ๋์ผํฉ๋๋ค.
>
>- array์ pointer๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ
>
>์๋ type ์์ฒด๊ฐ ํ๋ฆฌ๋ฏ๋ก ์์ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ๋์ ์๋ก ๋ค๋ฅธ ๊ฒ์
๋๋ค๋ง,
>(๋ฌผ๋ก ํ์ค์์๋ ์์ ๊ฒฝ์ฐ๋ค์ด ๋๋ถ๋ถ์ด์ง๋ง ^^) ๊ฐ์ฅ ๋ง์ด ํ๋ฆฌ๋ ๋ถ๋ถ๋ง ์ข
>์ ์ด๋ณด๋ก ํ๊ฒ ์ต๋๋ค.
>
>1. array ์ด๋ฆ์ l-value๊ฐ ๋ ์ ์์ง๋ง unmodifiable์ด๋ค.
ํ์ค์ ์ด๋ฅผ lvalue ์ modifiable lvalue ๋ก ๊ตฌ๋ถํ๊ณ ์์ต๋๋ค.
>์4)
>
>int a[10], *p;
>a = p; /* ์ด๋ฐ ์ผ์ ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. */
>
>2. referencing
>
>์ด๋ ์ด์ ์์น๋ ์ปดํ์ผ์ ํ ๋ ๊ฒฐ์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ด๋ ์ด์ ์ด๋ค ์์๋ฅผ
>์ฝ์ด์ค๊ธฐ ์ํด ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ ์ด ์์น๋ฅผ ๊ฐ์ ธ์ฌ ํ์๊ฐ ์์ต๋๋ค. ํ์ง๋ง
>ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ์๊ธฐ ์ํด์๋ indirect referencing์ ํด์ผํฉ๋๋ค.
์ด ๋ด์ฉ์ C ์ธ์ด๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ๋ ๋ฎ์ ๋ ๋ฒจ์์ ํ ๋ก ๋ ๋ด์ฉ์ ๋
๋ค. ์ธ์ด์ ์ถ์์ ์ ์์ธ C ์ธ์ด์ ์ ์๋ ๋ฐฐ์ด์ ์์น๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฑ์
ํ๋์ ์ ์ํ๊ณ ์์ง ์์ต๋๋ค. ์ด๋๊น์ง๋ type ์ ๋ง๋ ์์์ ํ๊ฐ์
side effect ๋ฑ์ด ์์ ๋ฟ์
๋๋ค.
๋ํ, ์ ์ ๊ธฐ์ต๋ถ๋ฅ๋ฅผ ๊ฐ๋ ๋ฐฐ์ด์ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ ํ ์คํ๋์ ์ฃผ์์์
(address constant) ๋จ๊ฒ ๋์ง๋ง, ์๋ ๊ธฐ์ต๋ถ๋ฅ๋ฅผ ๊ฐ๋ ๋ฐฐ์ด์ ๊ทธ๋ ์ง ์
์ง์.
[...]
>
>์ด๋ฐ ๋ ํผ๋ฐ์ฑ์ ์ฐจ์ด๋ก ์ธํด์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ ์คํ์ ์ค๋ฅ๋ฅผ ๋ด๊ฒ ๋ฉ๋๋ค.
>
>์6)
>
>file A:
> int a[10];
>
>file B:
> extern int *a;
> int c;
> c = a[10];
C ์ธ์ด๋ ์ด ํ๋ก๊ทธ๋จ์ ์ค๋ฅ๋ฅผ ๊ทธ๋ฐ์์ผ๋ก ํด์ํ์ง ์์ต๋๋ค. ์์ ํ๋ก
๊ทธ๋จ์ด undefined behavior ๋ฅผ ๊ฐ๋ ์ด์ ๋ ๋์์ฒด (object) ๋ฅผ ์ํ ๋ช
์นญ
์ธ a ์ type ์ด ํธํ๋๋๋ก ์ ์ธ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ํ B ์์
์ฌ๋ฐ๋ฅด๊ฒ a[10] ์ผ๋ก ์ ์ธ๋๋ค๊ณ ํ๋๋ผ๋ ๋ฐฐ์ด์ ๋ง์ง๋ง ์์ ๋ค์์
dereferencing ํ๋ ํ๋์ undefined behavior ์
๋๋ค.
[...]
>
>ํ์ค ๋ฌธ์๋ฅผ ๋ณด๋ ๊ฒ ๋ณด๋ค๋ ์ ๋ ์ฑ
์ ๋ณด์๋๊ฒ ๋ ๋ณ์ ๊ฑฐ ๊ฐ์ต๋๋ค.
ํ์ค๋ฌธ์๋ณด๋ค ๋ ์๋ ์ฑ ์ด ์์ต๋๊น? :) (๋๋ด์ ๋๋ค)
์๊ฐ ํ๋ ธ๊ตฐ์ ๋ค์๊ณผ ๊ฐ์ด ์์ ํฉ๋๋ค.
์6)
file A:
int a[10];
file B:
extern int *a;
int c;
c = a[0];
์ฐธ๊ฐํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก array type์ lvalue๋ usual unary conversion์ ์ํด,
array์ ์ฒซ ๋ฒ์งธ element๋ฅผ ๊ฐ๋ฆฌํค๋ pointer๋ก ๋ณํ๋ฉ๋๋ค. ๋จ ๋ค์์ 3๊ฐ์ง์
๊ฒฝ์ฐ๋
์ ์ธ์
๋๋ค.
1. array๊ฐ sizeof ๋๋ address operator(&)์ argument์ผ ๋,
2. character string literal ์ด character array๋ฅผ ์ด๊ธฐํํ๊ธฐ ์ํด ์ฌ์ฉ๋ ๋,
3. wide string literal ์ด wchar_t type์ array๋ฅผ ์ด๊ธฐํํ๊ธฐ ์ํด ์ฌ์ฉ๋ ๋,
์๋ฅผ ๋ค๋ฉด,
char a[] = "abcd"; /* No conversion */
char *b = "abcd"; /* Array converted to pointer */
int i = sizeof(a); /* No conversion; size of whole array */
b = a +1 ; /* Array converted to pointer */
> >์1)
> >int a[10], *p;
> >p = a;
> >
> >2. array์ ์ฒจ์(subscript)๋ ํฌ์ธํฐ ์คํ์
๊ณผ ๋์ผํ๋ค.
>
> a[i] ๋ ์ ์ ์์ฒด๊ฐ *((p)+(i)) ์
๋๋ค. ํฌ์ธํฐ ์คํ์
์ด๋ ๊ฒฐ๊ตญ ๋์์ฒด
> ํฌ์ธํฐ (pointer to object type) ์ ์ ์์ +, - ์ฐ์ฐ์
๋๋ค. ๋ฌผ๋ก ๋ฐฐ์ด
> ์ฒจ์ ์ญ์ (๋จ์ํ ์ค๋ช
์ด ์๋) ์ธ์ด์ ์ ์ ์์ฒด๊ฐ ํฌ์ธํฐ ์ฐ์ฐ์ผ๋ก ์ ์
> ๋๊ธฐ์ ๋ ์ฌ์ด์ ๊ตฌ๋ถ์ ์ ํ ํ์ ์์ต๋๋ค. - ๋ค๋ง ํ๋ก๊ทธ๋๋จธ์ ์๋๋ฅผ
> ํํํ๋ ๋ฐ ํ์ํ ๋ฟ์
๋๋ค.
>
> >์2)
> >
> >int a[10], *p, i;
> >p = a;
> >
> >for (i = 0; i < 10; i++) a[i] = 0;
> >for (i = 0; i < 10; i++) p[i] = 0;
> >for (i = 0; i < 10; i++) *(p+i) = 0;
> >for (i = 0; i < 10; i++) *p++ = 0;
> >
> >์์ ์๋ ๋ค๊ฐ์ for ๋ฌธ์ ๋ชจ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. (๋ฌผ๋ก ์ปดํ์ผ๋ฌ๊ฐ
> >๋ง๋ ์ฝ๋๋ ๋ค๋ฅผ ์ ์์ต๋๋ค๋ง)
์ฒจ์ธํ์๋ฉด, ์ฌ๊ธฐ์ ์ธ๊ธํ ๋ชฉ์ ์ฝ๋๋ค ๋ค๋ฅด๋ค๋ ๊ฒ์ ๋ํ์ ์ผ๋ก
a[i] ์ p[i]์ ๋ชฉ์ ์ฝ๋ ์์ฒด๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์
๋๋ค.
a[i] ์ p[i]๊ฐ ๋๊ฐ์ array element๋ฅผ ์ฐธ์กฐํ๊ณ ๋๊ฐ์ ๊ฒฐ๊ณผ ๊ฐ์ ๊ฐ์ง๋ค๊ณ
ํด์ ๋์ผํ(identical) ์์์ ์๋๋๋ค. ๋จ์ง ๋๋ฑํ(equivalent) ์์์ผ
๋ฟ์
๋๋ค.
๋ชฉ์ ์ฝ๋ ๋ถ๋ถ์ Jun Woong ๋์ ์ง์ ๋๋ก ๊ทธ๋ฆฌ ์ค์ํ ๋ถ๋ถ์ ์๋์ง๋ง,
๊ฐ๋
์ ๋ฆฌํ์ค ๋, ์๋ฉด ๋์์ด ๋๋ ์ด์ผ๊ธฐ๋ผ ์๊ฐํฉ๋๋ค.
> C ์ ์ธ์ด์ ์ ์๋ actual machine ์ด ์๋ abstract machine ์ด๋ฏ๋ก, ์ปด
> ํ์ผ๋ฌ๊ฐ ๋ง๋๋ ์ฝ๋๋ (C ์ธ์ด์ ์
์ฅ์์๋) ์ค์ํ์ง ์์ต๋๋ค. ๋ค๋ง
> ๊ทธ๋ฌํ ์ ์๊ฐ ์๊ตฌํ๋ ํ๋์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ฒ๋ผ (as if) ํด์ฃผ๊ธฐ๋ง ํ๋ฉด
> ๋๋ ๊ฒ์
๋๋ค.
> ๋ํ ์์ 4๊ฐ์ for ๋ฌธ์ค ๋ง์ง๋ง for ๋ฌธ์ ์์ 3๊ฐ์ ๊ฒฐ๊ณผ๋ก ๋์ค๋ ํ๋
> ์ด ๋ค๋ฆ
๋๋ค. (p ์ ๊ฐ์ด ๋ณํ๊ฒ ์ง์)
> >3. ํจ์์ ์ธ์๋ก ์ ์ธ๋ array ์ด๋ฆ์ ๊ทธ array์ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ์ ๊ฐ๋ฆฌํค๋
> >ํฌ์ธํฐ๋ก ์ทจ๊ธ๋๋ค.
aaa[] ์ *aaa ๋ผ๋ ์ผ๋ฐ์ ์ผ๋ก๋ ๋ค๋ฅธ ํํ์ด์ง๋ง, ํจ์์ argument๋ก
์ฌ์ฉ๋ ๋์ ํํ์ฌ ๋์ผํ ํํ์ผ๋ก ์ทจ๊ธ๋ฉ๋๋ค.
์ ํํ ํํํ์๋ฉด, array type์ ๊ฐ์ง aaa๊ฐ pointer ํ์ผ๋ก ๋ณํ๋์ด ์ทจ๊ธ
๋๊ธฐ์ ๋์ ํํ์ด ๋์ผํ ํํ์ผ๋ก ์ทจ๊ธ๋์ด์ง๋ ๊ฒ์
๋๋ค.
> ์๋ ์ค๋ช
์ ๋ง๋ ๋ง์ด์ง๋ง, ์ด ์ค๋ช
์ ์กฐ๊ธ ํ๋ฆฝ๋๋ค. ๋งค๊ฐ๋ณ์ ์ ์ธ์ ์ด
> ๋๊น์ง๋ ๋ช
์นญ์ ๋ํ type ์ ์ ์ธ์
๋๋ค. ์ ์ธ์์ ์ฒซ๋ฒ์งธ ์์๋ฅผ ๊ฐ๋ฅดํค
> ๊ณ ์ ๊ฐ๋ฅดํค๊ณ ๋ฑ์ ๋ฌธ์ ๋ ์๊ด์ด ์์ต๋๋ค. ์ข ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ค๋ช
ํ์๋ฉด,
> "ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ ์ธ๋ "์ฌ๋ฐ๋ฅธ" (-> ์๊พธ ๊ฐ์กฐํ๋ ์ด์ ๋ฅผ ์์๊ฒ ์ต๋
> ๊น?) ๋ฐฐ์ดํ (array of type) ์ ๋งค๊ฐ๋ณ์๋ ํฌ์ธํฐํ (pointer to type)
> ์ผ๋ก ๋ค์ ์ฐ์ฌ์ง๋๋ค (rewrite)." ๊ฒ ์ง์.
>
> >์3)
> >
> >void func(int *para) {}
> >void func(int para[]) {}
> >void func(int para[100]) {}
> >
> >์ธ๊ฐ์ ํจ์ ์ ์ ๋ชจ๋๊ฐ ๋์ผํฉ๋๋ค.
> >
> >- array์ pointer๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ
> >
> >์๋ type ์์ฒด๊ฐ ํ๋ฆฌ๋ฏ๋ก ์์ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ๋์ ์๋ก ๋ค๋ฅธ
๊ฒ์
๋๋ค๋ง,
> >(๋ฌผ๋ก ํ์ค์์๋ ์์ ๊ฒฝ์ฐ๋ค์ด ๋๋ถ๋ถ์ด์ง๋ง ^^) ๊ฐ์ฅ ๋ง์ด ํ๋ฆฌ๋ ๋ถ๋ถ๋ง
์ข
> >์ ์ด๋ณด๋ก ํ๊ฒ ์ต๋๋ค.
> >
> >1. array ์ด๋ฆ์ l-value๊ฐ ๋ ์ ์์ง๋ง unmodifiable์ด๋ค.
>
> ํ์ค์ ์ด๋ฅผ lvalue ์ modifiable lvalue ๋ก ๊ตฌ๋ถํ๊ณ ์์ต๋๋ค.
>
> >์4)
> >
> >int a[10], *p;
> >a = p; /* ์ด๋ฐ ์ผ์ ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. */
์ฒจ์ธํ์๋ฉด, a๋ array type์ lvalue์ usual unary conversion์ ๋ฐ๋ผ first
element์ pointer๋ก ๋ณํ๋๋ฏ๋ก value๋ฅผ assignment ํ ์ ์๊ฒ ๋๋ ๊ฒ์
๋๋ค.
ํ์ค๋ฌธ์๊ฐ ์ข๊ธด ํ๋ฐ ์ด๋ ต์ฃ .. ^^; ๊ฐ๋์ ์ฑ๊ฒฝ์ฑ
์ฝ๋ ๊ธฐ๋ถ์ด ๋ค๊ธฐ๋ ํฉ๋๋ค.
*^^*
๋! ์๋์น, ๋! ํ์ค๋ฌธ์
^0^
------------------------
Kong Hyeog Jun
"๊ตญ๊ฐ๋ณด์๋ฒ ์ฒ ํ๋๋ ๋ ์ ๊ธฐ๋ค๋ฆฌ๋ฉฐ"