zoukankan      html  css  js  c++  java
  • 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() 函数返回的指针指向的内存吗?

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

    种一棵树最好的时间是十年前,其次是现在。
  • 相关阅读:
    《算法竞赛入门经典》《算法竞赛入门经典——训练之南》:勘误、讨论及代码
    codeforces 340B Maximal Area Quadrilateral(叉积)
    codeforces 340C Tourist Problem(简单数学题)
    codeforces 340A The Wall(简单数学题)
    UVALive 4043 Ants(二分图完美匹配)
    UVA 11865 Stream My Contest(最小树形图)
    UVA 11354 Bond(最小瓶颈路+倍增)
    UVALive 5713 Qin Shi Huang's National Road System(次小生成树)
    UVALive 3661 Animal Run(最短路解最小割)
    卡尔曼滤波器
  • 原文地址:https://www.cnblogs.com/HyattXia/p/12822497.html
Copyright © 2011-2022 走看看