아주 기본적인 함수지만 실제 프로그램에서 흔히 할 수 있는 실수를 설명 하겠습니다.

 

strlen 과 sizeof 의 차이 입니다.

 

문자열을 취급 할 때에는 strlen을 사용하고, 버퍼의 크기나 변수의 크기를 다룰때에는 sizeof를 사용 합니다.

 


int main( void)
{
   char *str1 = "forum.falinux.com";
   char str2[30] = "forum.falinux.com";
   char *str3 = (char *)malloc(sizeof(char)*30);


 printf( "sizeof str1 [%d]\n", sizeof(str1));
 printf( "sizeof str2 [%d]\n", sizeof(str2));
 printf( "sizeof str3 [%d]\n", sizeof(str3));

 
 printf( "strlen str1 [%d]\n", strlen(str1));
 printf( "strlen str2 [%d]\n", strlen(str2));
 printf( "strlen str3 [%d]\n", strlen(str3));

 

 printf( "str1 = [%s]\n", str1);
 printf( "str2 = [%s]\n", str2);
 printf( "str3 = [%s]\n", str3);

   return 0;
}

 

위 코드의 결과는 다음과 같습니다.

 

sizeof str1 [4]
sizeof str2 [30]
sizeof str3 [4]

strlen str1 [17]
strlen str2 [17]
strlen str3 [0]
str1 = [forum.falinux.com]
str2 = [forum.falinux.com]
str3 = []

str1 변수의 크기는 char 의 포인터 변수로서 4byte 입니다.

str1의 문자열 길이는 17 byte 입니다.

 

배열 변수 str2의 크기는 30 byte 입니다.

벼열 변수 안에 저장된 str2의 길이는 17 byte 입니다.

 

str3의 크기 또한 char의 포인터 변수 크기인 4byte 입니다.

str3에는 문자열이 저장되어 있지 않기 때문에 길이는 0 byte 입니다만 이 변수는 초기화 되어 있지 않기 때문에

 printf( "str3 = [%s]\n", str3);
과 같은 코드는 위험 할 수 있습니다.

 

저의 경우에는 다행이 빈 문자열이 출력 되었습니다만 실제 코드에서는 절대 이렇게 사용하면 안됩니다.

 

memset( str3, 0, 30);

 

str3를 사용하기 전에 반드시 위와 같이 내용을 0으로 지워주는 습관을 가져야 합니다.