[问题] 中央堆叠内存配置与释放

楼主: Sunofgod ( )   2014-04-17 12:34:15
int *f(int x)
{
int y;
y = x + 10;
return &y;
}
int g(int y)
{
int x;
x = y – 10;
return x;
}
void main( )
{
int *x, y;
x = f(10);
y = g(*x);
printf(“%d %d\n”, *x, y);
}
这是一题国考考题
出现两种版本的答案
版本一:函数所使用的变量型态与数量一样,内存会配置到同样的位置
所以f跟g的区域变量共用相同内存位址 主程式的指标x当f执行结束跟着执行g时
会指到g当中的区域变量x 印出结果10 10
版本二:副程式执行结束后所属内存会被释放 因此主程式中的x变成悬疑指标
指像什么东西变成不知道,至于两个副程式的区域变量共用到相同内存只能说有可能
但不是铁律 印出结果 不确定 不确定(因为x后来指到的是系统内存 不确定内容)

这是某位补习班老师的解答,也就是版本二
至于版本一我是参考一本补习班出的 胡世雄 程式语言得参考书
自己用dev c++跑的确是10 10,两个副程式的区域变量也的确共用相同内存位址
但自己以往所学的确是版本二比较合理
这是国考非选 所以没有标准答案 也不知道当初怎样的答案会拿分....
这是我觉得国考很黑箱的一个地方Orz...........
请教各位版友对这种题目见解 究竟怎样才是对的
谢谢
作者: azureblaze (AzureBlaze)   2014-04-17 12:42:00
10也符合"不确定"的结果啊"一般而言"你会拿到10 可是没有任何保证你也可能得到硬盘格式化或宇宙毁灭
楼主: Sunofgod ( )   2014-04-17 12:45:00
10 10是这样来的 当f结束后把区域变量y(20)传回给main中x 此时呼叫g,g中的区域变量x会刚好用到main中x所指到的内存 所以当g执行结束g中的x变成10 同时main中的x也变成10 版本一的说法就是两个函式刚好同样数量与型态区域变量会共用相同内存 所以会有10 10结果 版本二则是比较合理 偏偏用dev c++去跑就是跑出10 10 所以请教各位该怎么样解释比较完善?如同该位老师的说法吗?
作者: azureblaze (AzureBlaze)   2014-04-17 12:51:00
10 10只是你的complier你的机器实做出来的结果"不确定"是说环境换了结果也可能换 语言标准没做保证这叫做结果"用devc++刚好会是10",不叫"一定会是10"有些compiler在debug模式下会把超过stack的内存抹掉用来侦测这种不正确存取,这时结果就会变标准并没有限制不能去更动这些正常碰不到的值
作者: yvb   2014-04-17 13:38:00
去编译器选项, 开个最佳化, 再试试看执行结果吧...至少我用 gcc 测试, 最佳化用 -O1 和 -O2, 答案都不是 10 10
作者: Killercat (杀人猫™)   2014-04-17 15:33:00
@@ 哪个国考考这种摆明是hack的东西阿...
作者: jokester (蛮王科科)   2014-04-17 16:33:00
实用时写出这样f的人会被刮吧
楼主: Sunofgod ( )   2014-04-17 17:51:00
了解了 感谢各位的解释 谢谢出在96年交通升资的程式语言中 应该如同该补习班金老师说的 考悬疑指标的观念结果同个补习班(高点)出的书却(版本一)....再次感谢各位

Links booklink

Contact Us: admin [ a t ] ucptt.com