1

有一个我认为我知道正确答案的谜题,但我也有一个问题。看一看:

Sample Code 
void printTime( time_t *t ) 
{ 
???? 
} 

以下哪一项可以代替???? 在上面的代码中以人类可读的形式打印在 t 中传递的时间?

  1. char s[ 100 ];
    ctime( t, s ); 
    printf( "%s\n", s ); 
    
  2. printf( "%s\n", ctime( t ) ); 
    
  3. printf( "%s\n", asctime( t ) ); 
    
  4. printf( "%s", t ); 
    
  5. char *s = ctime( t ); 
    printf( "%s\n", s ); 
    free( s ); 
    

我的答案是答案 2(函数 ctime 将 time_t 指针作为输入并返回一个指向字符串的指针,然后可以通过 printf 打印该字符串)。

答案 5 的代码在编译时也能正常工作,但为什么我们要在以前没有分配存储空间的情况下使用 free() 呢?您认为这就是答案 5 错误的原因吗?

谢谢你,普热梅克

4

1 回答 1

3
  1. 这种方式行不通,ctime_r 改用。
  2. 有效并且是正确的。
  3. 类型错误,您必须先转换它,例如使用localtime.
  4. 错误的可变参数类型,char*预期但time_t*已给出。
  5. 不正确的空闲,因为ctime管理其缓冲区本身,例如使用静态缓冲区。

一般来说,这些函数中的大多数(即asctime, ctime, localtime...)现在有两种变体:使用一些静态分配的缓冲区来保存返回值的历史形式,以及带有_r代表reentrant的后缀的更现代的版本。对于后者,您必须自己提供输出缓冲区,这意味着您负责分配它。最大的优点是多个线程可以同时使用可重入版本,而不必担心覆盖彼此的结果。

于 2013-01-17T14:02:39.267 回答