【嵌入式-c语言】ctime() 返回值的探讨

ctime() 返回值的探讨
char* ctime (const time_t * timer);

先看下问题起源:

#include <time.h>
#include <stdio.h>
#include <stdlib.h>.
 
int main(int argc,char *argv[]){
time_t time_start = 1610504148;
time_t time_end   = 1610604222; 
char *p_start = ctime(&time_start); 
char *p_end   = ctime(&time_end); 
//第1种输出方法 
printf("t1 = %s t2 = %s",p_start, p_end); 
//第2种输出方法
printf("t1 = %s t2 = %s",ctime(&time_start), ctime(&time_end));
//第3种输出方法
printf("t1 = %s",ctime(&time_start));
printf("t2 = %s",ctime(&time_end)); 
}

上述3种输出方法中:
第一种方法输出t1和t2均是time_end
第二种方法输出t1和t2均是time_start
只有第三种方法的输出是正确的

原因分析:
首先这个函数很奇特,返回值是个指针,思考一个问题,这个指针指向的内存地址在哪儿 对应的内存是怎么分配来的 能不能用free()释放掉 这个函数用的次数多了会不会造成内存泄露。根据个人理解 ctime()返回的字符串长度应该是相对固定的,这个固定长度的字符串能表达的时间是很长的 比如 yyyy mm dd hh:mm:ss 可以表达的时间可以到9999年12月31日 所以这个指针所指的内存不是动态分配的,很可能是个全局的变量(字符数组)。也就是说ctime()返回的指针所指的地址是固定的,但内容在每次调用后会被刷新。

具体分析下:
第一种输出方式 两个指针都指向同一块内存,这块内存保存的是最后一次的结果,输出的是 time_end;
第二种 调用printf()函数 而函数的后两个参数是ctime()的返回值,需要先调用ctime()函数求出printf()的入参,函数参数从右向左入栈(关于调用约定请自行搜索) 相当于先调用 ctime(&time_end) 再调用ctime(&time_start);
第三种 在第二次打印输出之前 第一次输出已经执行完毕,所以不受影响可以正常输出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值