C语言中ctime()和loacaltime()使用中遇到的问题
近期在学习Linux C编程,在使用 localtime() 函数时遇到了比较奇怪的问题,我本想对比文件的最近修改时间和系统当前时间年份是否一致,按说定义两个struct tm*类型指针,再获取到两个struct tm *类型的指针变量后进行比较便可,但是无奈这两个结构体指向的tm_year成员值是一样的,那么只能猜想到其实 localtime() 函数返回的的指针其实是指向内存中同一个地址,输出两个指针也验证了我的猜想是正确的。
然后查看文档发现事情就是这样的,查看了Linux man手册,看到如下关键信息:
Too young! Too naive!
也就是说 localtime() 函数返回了一个静态变量的地址(至于是静态局部变量还是静态全局变量便不从得知了),在同一个程序中,对于多次不同调用,localtime() 只是重新覆盖了这个静态变量的值而已,自然返回的指针便指向内存中相同的物理地址,通过两个指针变量访问到的也就是同一个结构体变量。
如果想要完成对比两个日期的年份是否一致,通过以下代码便可以办到:
struct tm* ptr1, *ptr2; ptr1 = (struct tm*)malloc(sizeof(struct tm)); ptr2 = (struct tm*)malloc(sizeof(struct tm)); memcpy(ptr1, localtime(&date1), sizeof(struct tm)); memcpy(ptr2, localtime(&date2), sizeof(struct tm));
date1 和 date2 为两个time_t类型的变量,通过内存拷贝函数 memcpy(), 拷贝localtime() 函数返回的静态变量中所有的值到我们自己在堆(heap)上动态申请的空间上即可。
使用完记得手动释放申请的内存空间。
free(ptr1); ptr1 = NULL; free(ptr2); ptr2 = NULL;
也可以定义局部变量,保存想要比较的成员变量的值后,再次执行 localtime() 函数,比较相应的成员变量即可。
如果不清楚以上的信息,还会产生另外一个疑问,那就是我们需要释放ctime() 和localtime() 函数返回的指针指向的内存吗?
现在也得到了答案:不用,并且造成内存泄漏的风险。