使用含static变量的函数时需谨慎

来源:互联网 发布:mac chrome 无法下载 编辑:程序博客网 时间:2024/04/27 14:46

   同事需要实现一个函数,来判断两个time_t类型的变量是否表示同一天。查了下AUPE, 他使用了localtime来将time_t类型的时间转换成真实世界的日期时间表示法。不过后来发现函数实现有问题,无论传入的两个time_t类型变量的值是多少,函数都返回是在同一天。

   后来另一同事找到了问题的根源:locatime函数返回的struct tm *的指针指向的是函数内部的一个静态变量。如果多次调用localtime函数,静态变量的值是最后一次调用时的值。而同事两次调用了localtime函数,且只保留了指向静态变量的指针,所以 就会无法得到前一次的struct tm的值。

  解决的方法也很简单,要么保存前一次的struct tm值,要么localtime比较安全的一个版本:

struct tm *localtime_r(time_t *CLOCK, struct tm *RES);

 RES传入的一个struct tm变量的地址,这样 RES实际上起到了返回值的作用。

   另外,以后碰到返回指针的函数就要多小心了。要清楚这个指针到底是指向哪里的 :-)