2010. 4. 2. 13:04

문자열을 값에 의한 전달(Call By Value)을 어떻게 하는가?


다음 예제가 있다고 가정하겠습니다.

void main()
{
    char str = { "대한님국" };    

    fncA( str );
}

// 참조에 의한 전달

void fncA(char *str)
{

     ....

}

값에 의한 전달은 어떻게 할 수 있을까요?

천천히 살펴 봅시다.

char *str = "대한민국";

위의 선언을 풀이해보면, 메모리상 어딘가에 "대한민국"이라는 문자열 상수가

연속된 8byte 공간에 할당될 겁니다(한글 한자는 2byte기 때문에).

char *str;은 character형의 주소 가리킬 수 있는 포인터입니다.

char형은 1byte입니다. 1byte 메모리 공간에 대해서만 접근하고 참조할 수 있습니다.

함수의 인자를 받을때 char로 받으면 1byte 메모리 공간밖에 받을 수 없습니다.

결과적으로는 사용자 정의 자료형을 하나 선언해서 그 자료형을 넘겨 주어서 참조해야

합니다.

 

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

void fncA(struct string_t dest_string);

struct string_t
{
    char str[10];

};

int main(void)
{

    string_t string;

    strcpy( string.str, "대한민국" );

    fncA( string );

    printf( "%s", string.str );

    return 0;

}

void fncA(struct string_t dest_string)
{
    strcpy( dest_string.str, "우리나라" );

    printf( "%s\n", dest_string.str );
}

 

위와 같이 사용자 정의 자료형을 인자로 넘겨준다면, Call-By-Value가 성립됨을 알 수 있습니다.

※ 사용자 정의 자료형 내에서 맴버 str을 포인터형으로 줄 수 없는 이유가

   함수의 인자로 사용자 정의 자료형을 넘길 때, 맴버 대 맴버 복사가 이루어지는데,

   포인터 str 자체 즉, 4byte 공간만 복사될 뿐,

   맴버 포인터가 가리키는 문자열까지 복사가 불가능합니다.

   왜냐하면, 힙에 동적으로 할당된 공간자체가 맴버로 구조체에 포함되어 있지 않기 때문입니다.


Written By Sim-Hyeon, Choe