C 함수 중에 포인터 값을 반환하는 함수가 있습니다. 예를 들어 ctime()이 그렇지요. 시간을 읽기 좋게 문자열을 반환하는 함수인데 사용하는 방법은 아래와 같습니다.


#include <stdio.h>

#include <time.h>


int main( void)

{

   time_t   current_time;


   time( &current_time);


   printf( "%ldn", current_time);

   printf( "%s\n", ctime( &current_time));


   return 0;

}


위의 예제는 FALINUX 포럼의 함수 설명에 나온 것입니다. 그런데 아래와 같이 실행하면 어떻게 될까요?

if 조건절을 만족할까요?


time_t   current_time;


char *p_1st;

char *p_2nd;


time( &current_time);

p_1st = ctime( &current_time); 


sleep( 2);


time( &current_time);

p_2nd = ctime( &current_time); 


if ( p_1st != p_2nd){

    printf( "시간이 변경되었음\n");

}


p_1st를 구할 때 보다 2초나 지나 p_2nd 값을 구했으니 p_1st 때와는 달리 p_2nd는 2초 지난 시간의

문자열을 가지고 있을 것입니다. 그렇다면 p_1st와 p_2nd는 다르지 않을까요?


생각해 보면 그렇지만 결과적으로는 생각처럼 되지 않습니다.

이유는 p_1st에 담겨온 주소와 p_2nd가 받은 주소 모두 같은 주소이기 때문입니다.

ctime() 함수는 현재 시간을 문자열로 구하고 그 문자열을 어디에 담아야 하기 때문에

자체 버퍼를 가지고 있습니다. 그리고 그 버퍼 주소를 넘겨 주는 것이죠.


이해가 어려우시면 두 변수를 출력해 보십시오.


time_t   current_time;


char *p_1st;

char *p_2nd;


time( &current_time);

p_1st = ctime( &current_time); 

printf( "1) %s\n", p_1st);


sleep( 2);


time( &current_time);

p_2nd = ctime( &current_time); 


if ( p_1st != p_2nd){

    printf( "시간이 변경되었음\n");

}


printf( "2) %s\n", p_1st);

printf( "3) %s\n", p_2nd);


실행하면 아래와 같이 출력됩니다.


]$ gcc test.c

]$ ./a.out 

1) Sun Jun 17 15:04:33 2012


2) Sun Jun 17 15:04:35 2012


3) Sun Jun 17 15:04:35 2012


]$ 


p_2nd만 변경했는데 p_1st 값 까지 바뀌었죠? 이는 당연한 결과로

p_1st와 p_2nd가 서로 다른 변수라고 하더라도 가지고 있는 주소 값은

ctime() 함수가 준 같은 주소 값을 가지고 있기 때문입니다.


만일 ctime() 함수가 매번 다른 버퍼를 잡고 새로운 주소 값을 반환한다면

ctime() 함수 호출 후에 free()함수를 호출해야 할 것입니다.

이런 혼동과 오류를 막기 위해 ctime() 함수를 만든 개발자는 함수 자체 버퍼를

사용하도록 한 것이죠.


주소를 반환하는 함수를 사용하실 때에는 이점에 유의하세요. ^^