マルチスレッドコードでこれを使用することが決してなく、最初の回答を使用する前に2回呼び出すことがないことが確実でない限り、静的バッファを使用しないでください。
Malloc はオプションですが、呼び出し先が割り当てたメモリを呼び出し元に強制的に解放させると、所有権の問題が未解決のままになり、バッファにヒープ メモリ以外を使用する可能性がなくなります。
私の意見では、あなたの最善の策は、アンドリュー・グラントの提案を変更することですが、バッファの長さも渡します。
char *czas(char *buffer, size_t bufferLength)
{
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
strftime (buffer, bufferLength, "Now it's %I:%M%p.",timeinfo);
return buffer;
}
int main()
{
char buffer [80];
printf("%s",czas(buffer, sizeof(buffer)));
system("PAUSE");
}
または
#define TIME_BUFFER_LENGTH 80
int main()
{
char *buffer = malloc(TIME_BUFFER_LENGTH);
if (buffer)
printf("%s",czas(buffer, TIME_BUFFER_LENGTH));
free(buffer);
system("PAUSE");
}
これにより、潜在的なメモリ リークやバッファ オーバーフローを追跡しやすくなります。czas引数が正しい限り、関数がバッファをオーバーフローしたり、メモリをリークしたりしないことがわかります。次に、いずれかのバージョンを調べmainて、メモリ リークがないこと、および czas に渡されたパラメータが正しいことを確認します (bufferLength パラメータは、バッファが指すスペースの量を正確に指定します)。