강좌 & 팁
C 함수 중에 포인터 값을 반환하는 함수가 있습니다. 예를 들어 ctime()이 그렇지요. 시간을 읽기 좋게 문자열을 반환하는 함수인데 사용하는 방법은 아래와 같습니다.
#include <stdio.h>
#include <time.h>
int main( void)
{
time_t current_time;
time( ¤t_time);
printf( "%ldn", current_time);
printf( "%s\n", ctime( ¤t_time));
return 0;
}
위의 예제는 FALINUX 포럼의 함수 설명에 나온 것입니다. 그런데 아래와 같이 실행하면 어떻게 될까요?
if 조건절을 만족할까요?
time_t current_time;
char *p_1st;
char *p_2nd;
time( ¤t_time);
p_1st = ctime( ¤t_time);
sleep( 2);
time( ¤t_time);
p_2nd = ctime( ¤t_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( ¤t_time);
p_1st = ctime( ¤t_time);
printf( "1) %s\n", p_1st);
sleep( 2);
time( ¤t_time);
p_2nd = ctime( ¤t_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() 함수를 만든 개발자는 함수 자체 버퍼를
사용하도록 한 것이죠.
주소를 반환하는 함수를 사용하실 때에는 이점에 유의하세요. ^^