문자열을 값에 의한 전달(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