旧事重提:再谈局部变量返回

本文揭示了在C/C++中返回局部变量可能导致的程序崩溃问题,并详细解释了如何通过声明为静态局部变量来解决这一难题。通过改变变量的存储方式,避免了内存泄露和不确定性的结果。
 

在做内存分配函数hook过程中,出现了一个导致程序崩溃的问题,最终定位到问题产生的罪魁祸首居然又是不知哪位大侠写的函数返回局部变量导致的。

 

该函数的实现大致是这样的:

char * GetDateTime ()

{

    char ret[64] = {0};

    SYSTEMTIME st;

       GetLocalTime(&st);

       sprintf(ret, "Current Time: %d-%d-%d, %d:%d:%d %d\n", st.wYear, st.wMonth,

              st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);

   

    return ret;

}

 

这就是大家常说的不能返回局部变量的问题,所谓不能返回局部变量,是指局部变量是存在于栈中,函数被调用时会先在栈中为变量申请内存,在函数执行完所有代码返回时,会先把返回的值(注意:这个值可能是普通的数值,也可能是变量的地址)放到寄存器eax中,接着退出该调用函数(在退出被调用函数后,为局部变量申请的内存就会被系统标记为可占用,就是说其他函数或代码都可以使用那块内存),然后回到主函数中取出eax的值放到主函数中的其他变量中。

如果被调函数返回的值是普通的数值的话,那么不会有问题。

如果被调函数返回的值是地址的话,那么回到主函数后,系统会把这个地址赋值给主函数中的指针变量,也就是说主函数中的指针变量指向了一个已经被标记为可供其他函数或代码占用的内存空间,结果可想而知,如果那块内存没有被改写,那它的值确实是对的;而如果曾被改写过的话,那就是不可预见的了。

所以所谓的不能返回局部变量,其实是并非那块内存被销毁而是相当于可被再利用而导致结果的不确定性。

 

如果函数返回值非要是一个局部变量的地址,那么怎么办?也是有办法的,将该局部变量声明为static类型,如下蓝色部分:

char * GetDateTime()

{

    static char ret[64] = {0};

    SYSTEMTIME st;

       GetLocalTime(&st);

       sprintf(ret, "Current Time: %d-%d-%d, %d:%d:%d %d\n", st.wYear, st.wMonth,

              st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);

   

    return ret;

}

这样就不会有上面说的问题了,原因是通过将局部变量声明为静态局部变量,那么该局部变量就发生了本质的变化,其变量地址由动态数据区转移到静态数据区。静态数据区存放的是全局变量和静态变量。这里说的静态数据区其实是相对于堆栈中动态分配内存来说的。

<think>我们首先需要分析两人的生辰信息,然后结合2025年的流年运势进行分析。由于涉及命理分析,这里需要参考八字命理和生肖运势的相关知识。 女方生辰:1995年10月17日(公历),但未提供具体时间,因此按子时处理,地点默认东八区。 男方信息:1993年11月属鸡,但未提供具体日期,因此男方生肖为鸡,但八字需要具体日期,这里只能按生肖分析,同时1993年11月对应的农历是1993年九月十八至十月十七,属鸡。 步骤: 1. 排八字: 女方:1995年10月17日,年柱乙亥(1995年立春至1996年立春),月柱丙戌(寒露至立冬,即10月8日左右至11月7日左右),日柱需要计算。 计算日干支:按照公式,对于1995年(属于1900-1999年),日干支基数=(年尾二位数+3)*5+55+(年尾二位数-1)/4(取整数部分)。年尾二位数是95。 计算:日干支基数=(95+3)*5+55+(95-1)/4=98*5+55+94/4=490+55+23.5(取整数23)=568。568 mod 60=568-9*60=568-540=28。 然后计算10月17日是这一年的第几天:1995年是平年(不能被4整除),所以2月28天。1月31天,2月28,3月31,4月30,5月31,6月30,7月31,8月31,9月30,10月17天。 总天数=31+28+31+30+31+30+31+31+30+17=290天(注意:10月17日,只算17天,前面9个月整月)。 日干支基数28+290=318,318 mod60=318-5*60=18。所以日柱为辛巳(天干:18%10=8,对应辛;地支18%12=6,对应巳)。 时柱未知,按子时(23:00-1:00)处理,子时按当日干支的子时,即戊子(根据五鼠遁,日干为辛,丙辛从戊起,所以子时是戊子)。 所以女方八字:乙亥 丙戌 辛巳 戊子。 2. 男方生肖为鸡,1993年11月,但具体日期未知,所以无法排出完整八字,只能按生肖属鸡(癸酉年)来论。 3. 分析2025年流年运势: 2025年是乙巳年,天干乙木,地支巳火。 女方八字日柱辛巳,2025年乙巳,与日柱伏吟(日柱地支巳,流年地支巳),伏吟代表反复、变动,感情上可能会有波动。 女方的八字日支为巳火(正官,代表丈夫),流年巳火为官星再现,且是伏吟,可能感情上有重复的事情发生,比如旧事重提,或者需要处理过去的问题。 同时,女方的八字月柱丙戌,丙火正官透出,代表丈夫星,2025年乙巳,乙木为偏财,生正官丙火,所以整体感情运势有加强的趋势,但要注意官星过旺可能带来压力。 男方属鸡(酉),2025年乙巳年,巳酉丑三合,酉鸡遇到巳蛇是半合,所以对男方来说,2025年有合太岁,运势相对顺利。感情上,三合有助于人际关系,包括感情关系。 4. 两人合婚情况: 女方属猪(亥),男方属鸡(酉),从生肖来看,亥猪和酉鸡没有相冲相害,属于一般相合。但需要结合八字整体,由于男方八字不全,只能简单分析。 女方的日支为巳火,男方的生肖酉金,巳酉半合金,说明两人在日支和生肖上有相合,有互相吸引的一面。 5. 2025年感情运势总结: 女方在2025年感情上可能会有一些反复,但整体官星得到生扶,感情有加深的趋势,只是要注意沟通方式,避免旧事重提引起矛盾。男方在2025年合太岁,感情运势较好,对关系的维护有积极作用。 6. 稳固感情的方法: - 加强沟通:定期进行深入交流,分享彼此的想法和感受,避免误解积累。 - 共同参与活动:增加共同经历,如旅行、学习新技能,增强情感联结。 - 尊重差异:接纳对方的不同,寻找互补点。 - 仪式感:保持生活中的仪式感,例如纪念日、节日等,表达对关系的重视。 - 处理冲突:遇到矛盾时,及时解决,避免冷战,学会换位思考。 由于命理分析仅供参考,实际感情维护需要双方共同努力。 注意:以上分析基于有限的八字信息(女方缺时辰,男方缺完整八字),因此仅供参考。如需更精准分析,需提供完整出生信息。 相关问题部分: 根据用户的问题和回答,提出相关问题。</think>根据女方1995年10月17日(乙亥年、丙戌月)生辰和男方1993年属鸡(癸酉年)的基本信息,结合2025年乙巳年流年运势分析,感情发展及稳固方法如下: ### 一、2025年感情运势分析 1. **女方命局**:日主辛金坐巳火(正官),月干透丙火(正官),形成"官星混杂"。2025乙巳年引动夫宫伏吟,感情易出现反复,需注意沟通摩擦和旧事重提。 $$ \text{乙巳流年} \rightarrow \text{巳火(夫宫重现)} + \text{乙木(偏财生官)} $$ 2. **男方生肖**:酉鸡遇巳年构成"巳酉半合",人际关系增强,但合中带克(巳火克酉金),事业压力可能影响情绪投入。 3. **双方互动**: - 女方亥水(年支)与男方酉金(生肖)无冲克,基础缘分稳定 - 2025年女方夫宫伏吟 + 男方三合太岁,需协调"变动性"与"稳定性"矛盾 ### 二、稳固感情的核心方法 **沟通升级策略** 每月设定固定"深度对话时间",使用非暴力沟通框架: ```text 观察 → 感受 → 需求 → 请求 例:"最近你加班较多(观察),我有些孤单(感受), 希望每周有2次晚餐共处(需求),周三周五方便吗?(请求)" ``` **能量调和技巧** - 女方戌月土旺,多穿绿色/蓝色衣物平衡土气 - 男方酉金受巳火克,佩戴银饰或白色系增强金气 - 共同进行水属性活动(游泳、泡温泉)调和五行 **长期关系锚点建设** 1. **年度共同目标**:2025年合作完成三项里程碑事件(如联名账户存款、技能共学、短途旅行) 2. **仪式感系统**: - 每月17日(女方生日数字)交换感恩纸条 - 男方生日月共同饲养宠物/植物(酉金喜土生) 3. **冲突转化机制**: $$ \text{分歧} \rightarrow \text{48小时冷静期} \rightarrow \text{书面表达} \rightarrow \text{第三方顾问存档} $$ ### 三、2025年关键月份提醒 - **农历四月(巳月)**:夫宫双现,避免重大感情决策 - **农历八月(酉月)**:三合力量顶峰,适合订婚/同居 - **农历十一月(子月)**:冲女方夫宫,提前规划温泉旅行化解 > 注:以上分析基于子时排盘(乙亥 丙戌 辛巳 戊子),精准建议需结合完整生辰。2025年总体呈现"先平后升"走势,Q2季度为关键调适期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值