结构体指针传参与返回值

结构体指针



结构体指针大家想必都非常清楚,我们也一直强调传参的时候使用结构体指针(占用4字节),减少对栈的压力。
但是今天看linux的标准io时候。发现了localtime时间函数 返回值是一个结构体指针。当时有点懵逼了,开始觉得这样就不对。{当然肯定是我想多了}


      为什么会觉得不对那?因为它是个子函数,返回一个局部变量的地址显然是没有价值的。函数调用完就被释放了呀。你在用指针承接也没有价值,完全是野指针啊。百度了一下还真的有人在么做,结果出现了问题。但是其实我的想法是错误的。人家大神怎么可能犯这种错误!突然想到了malloc。人家肯定是用了malloc来分配了空间。就是你的子函数调用完,这块malloc申请的空间也不会释放,除非free。(至于为什么。这源于他们分配空间的地方不同。改天反汇编贴出让大家看看)。那就ok了吗?当然没完。它什么时候释放那?我也不知道啊。在学习了内核源码,看看他的本质吧!

ocaltime函数
将时间数值变换成本地时间,考虑到本地时区和夏令时标志;
原型: struct tm *localtime(const time_t * calptr);
头文件 <time.h>
 返回值:
成功: struct tm *结构体, 原型如下:
struct tm {
int tm_sec; /* 秒 – 取值区间为[0,59] */
int tm_min; /* 分 - 取值区间为[0,59] */
int tm_hour; /* 时 - 取值区间为[0,23] */
int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
int tm_year; /* 年份,其值等于实际年份减去1900 */
int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一 */
int tm_yday; /* 从每年1月1日开始的天数– 取值区间[0,365],其中0代表1月1日 */
int tm_isdst; /* 夏令时标识符,夏令时tm_isdst为正;不实行夏令时tm_isdst为0 */
};
此结构体空间由内核自动分配, 而且不要去释放它.
失败: NULL

结构体局部变量传参的错误



truct fenshu
{
int fenzi;
int fenmu;
};
fenshu* add(fenshu* a,fenshu*b)
{
fenshu *s;
s->fenmu=a->fenmu*b->fenmu;
s->fenzi=a->fenmu*b->fenzi+a->fenzi*b->fenmu;
return s;


};
fenshu * mul(fenshu* a,fenshu*b)
{
fenshu* s;
s->fenmu=a->fenmu*b->fenmu;
s->fenzi=a->fenzi*b->fenzi;
return s;
}
2016年10月14日12:24:06 张飞online

原文地址:https://www.cnblogs.com/zhangfeionline/p/5959932.html