マルチスレッドコードでこれを使用することが決して確実でない場合や、最初の応答を使用する前に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パラメーターは、バッファーが指すスペースの量を正確に指定します)。
これは古典的ですエラー - 誰もが一度それを作る必要があります、その後、彼らは "範囲"について理解するでしょう。ところで、未定義のバッファはまだメモリに残っている可能性があるので、あなたは幸いです。時にはこのようなものは発見されません! – gbarry