C--关于函数形参和返回值的思考

前言

Linux终端中使用man 2 timeman 3 ctime查询后,可以得到很多相关函数说明,以下只取了三个函数。在调用Linux系统中的时间API接口时,仔细想了想如何给函数传参以及如何从函数接收返回值。想出了几种方法,然后写代码去运行,这个过程之中还是遇到了点问题,现在想通了于是好好梳理一番。

time_t time(time_t *tloc);
char *ctime(const time_t *timep);
char *ctime_r(const time_t *timep, char *buf);

time函数

time_t *tloc类型是time_t 、输出型参数,函数提供返回值,类型也是time_t 。以下三种方式获取时间值都是可以的:

time_t t;
time(&t);
time_t t;
t = time(NULL);
time_t t;
t = time(&t);

机智的我还尝试了这种方式:

time_t *pt;
time(pt);

结果:段错误 (核心已转储)
原因:指针没有初始化就使用了!未初始化就使用很可能引起段错误,导致程序崩溃。指针未初始化它的值是不确定的,作为实参传入函数的时候,函数内部并不会再给它分配空间去初始化!

ctime函数

const time_t *timep参数为输入型参数,因为它加了const关键字。该函数内部动态申请内存用来存储字符串的值,并返回一个字符指针。ctime函数为不可重入函数,不可重入含义是:不可重复进入,不可被并行调用,不可被中断,依赖于任务环境,多任务调度过程中数据可能会出错。满足了以下几个特点多是不可重入函数:

  • 函数体内使用了静态的数据结构;
  • 函数体内调用了malloc()或者free()函数;
  • 函数体内调用了标准I/O函数。

函数调用方法:

time_t t;
char *p;
	
t = time(&t);
p = ctime(&t);	 // here	
				
printf("time: %s\n", p);

函数返回值直接定义指针就行了,p = ctime(&t);的作用是给指针初始化。

ctime_r函数

The four functions asctime(), ctime(), gmtime() and localtime() return a pointer to static data and hence are not thread-safe. The thread-safe versions, asctime_r(), ctime_r(), gmtime_r() and localtime_r(), are specified by SUSv2.
根据man手册可以看出,ctime_r是ctime的线程安全版本,同时也是可重入函数,关键修改在于函数形参,可以传入数组而不在函数内部申请。

猜你喜欢

转载自blog.csdn.net/Meteor_s/article/details/83824733