아래 만인학님이 올리신 PRINTF함수는 편리하긴 한데..
한가지 중대한 문제가 있어서 이 게시판 성격에 맞지 않는 글임을 알면서
글을 올리게 됐습니다. ^^;
문제가 되는 것은 마지막 리턴할때인데요.
return(strdup(temp));
strdup함수는 문자열의 크기만큼 새로운 메모리를 할당할수 있는 편리함이 있으나
메모리할당을 malloc함수를 사용하기 때문에 이 메모리를 해제해 주는것은 사용자의 책임이라고
할수 있습니다.
따라서 사용법은 아래와 같이 고쳐져야 겠지요.
char *p = PRINTF("%d",x);
ShowMessage(p);
free(p); // 메모리를 해제해 줘야하니까요.
이렇게 사용해야만 한다면 굳이 이 함수를 만든 의미가 없어질것 같습니다.
그래서 이런 문제를 피하기 위해 두가지 방법이 있는데요..
첫째는 ShowMessage함수를 PRINTF함수 내부로 넣어버리는 방법입니다.
이렇게 하면 간단하긴 하겠지만..
PRINTF함수의 사용 용도를 메시지 표시 전용으로 제한 할 수 밖에 없기 때문에
단지 그 용도로 쓰신다면 상관없겠지만
원래 함수를 만든 취지에는 맞지 않는거 같습니다.
두번째는
PRINTF함수 안에 문자열을 static으로 만드는겁니다.
char *PRINTF(char *fmt, ...)
{
static char temp[MAX_SIZE];
va_list argptr;
int cnt;
va_start(argptr, fmt);
vsprintf(temp, fmt, argptr);
va_end(argptr);
return temp;
}
이렇게 하면 문자열 배열의 메모리가 해제될 염려는 없고요
항상 일정 크기의 메모리가 확보된다는 장점이 있습니다.
게다가 원래 의도한 사용법 대로 사용할 수 있다는거죠..
이 게시판 성격에 맞지 않는 글을 올린것 같은데...
문제가 있다면 삭제하도록 하겠습니다.