c语言 ctime(),C语言中ctime()和loacaltime()使用中遇到的问题

近期在学习Linux C编程,在使用 localtime() 函数时遇到了比较奇怪的问题,我本想对比文件的最近修改时间和系统当前时间年份是否一致,按说定义两个struct tm*类型指针,再获取到两个struct tm *类型的指针变量后进行比较便可,但是无奈这两个结构体指向的tm_year成员值是一样的,那么只能猜想到其实 localtime() 函数返回的的指针其实是指向内存中同一个地址,输出两个指针也验证了我的猜想是正确的。

然后查看文档发现事情就是这样的,查看了Linux man手册,看到如下关键信息:

32515ea85d96a5e69ce716442c5a565b.png

Too young! Too naive!

也就是说 localtime() 函数返回了一个静态变量的地址(至于是静态局部变量还是静态全局变量便不从得知了),在同一个程序中,对于多次不同调用,localtime() 只是重新覆盖了这个静态变量的值而已,自然返回的指针便指向内存中相同的物理地址,通过两个指针变量访问到的也就是同一个结构体变量。

如果想要完成对比两个日期的年份是否一致,通过以下代码便可以办到:

struct tm* ptr1, *ptr2;

ptr1= (struct tm*)malloc(sizeof(structtm));

ptr2= (struct tm*)malloc(sizeof(structtm));

memcpy(ptr1, localtime(&date1), sizeof(structtm));

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() 函数返回的指针指向的内存吗?

现在也得到了答案:不用,并且造成内存泄漏的风险。

原文:https://www.cnblogs.com/HyattXia/p/12822497.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值