C语言开发文字冒险游戏 getArea函数封装后nDay变量不更新
nDay无法正常更新的原因拆解
核心本质:nDay的存在周期撑不起累加需求
你现在的代码里,nDay是定义在getArea函数内部的自动局部变量:
- 这类变量存放在程序的栈内存上,仅在
getArea被调用、到函数执行完return返回main的这段时间内有效。一旦函数退出,栈上分配给nDay的内存就会被系统回收,之前累加的数值会直接消失,根本留不到下一次函数调用。 - 更直接的问题是你在
getArea刚启动的位置就写死了nDay = 2;,哪怕上一次调用函数时把nDay累加到了15,下一次main的switch分支再触发getArea执行,第一行就会把nDay强制重置回初始值2,完全没有保留累加结果的可能。
为什么内嵌到main里运行就正常
把区域选择逻辑直接写在main里时,nDay是main函数的局部变量:从程序启动进入main开始,这个变量的栈空间会一直保留到main执行结束。你在switch分支里执行nDay++操作的就是这个长期存在的变量,累加结果会一直保留,自然能正常更新。
设计上的遗漏
C语言默认是值传递,你现在的getArea既没有把内部的nDay通过返回值传回给main,也没有通过指针参数传入nDay的地址做双向修改,函数内部对nDay的所有操作,根本不会影响到main侧的变量,自然达不到正常累加的效果。
补充:如果要恢复
nDay的累加逻辑,要么在main中定义nDay变量、将其内存地址通过参数传给getArea直接操作,要么将nDay定义为静态全局变量,才能让它的累加值跨函数调用保留。
内容的提问来源于stack exchange,提问作者Kumari VJ
相关产品推荐
相关产品推荐

