不要使用静态缓冲区,除非您确定永远不会在多线程代码中使用它,并且在使用第一个答案之前永远不会调用它两次。
Malloc 是一种选择,但强制调用者释放被调用者分配的内存可能会留下未解决的所有权问题,并消除使用除堆内存之外的任何内容作为缓冲区的可能性。
在我看来,你最好的选择是修改 Andrew Grant 的建议,但也要传递缓冲区的长度:
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 参数准确地指定了缓冲区指向的空间量。)