【c语言】请问以下程序输出什么?为什么?

[复制链接]
查看11 | 回复5 | 2011-9-10 10:25:06 | 显示全部楼层 |阅读模式
这种情况 下 可能编译不会通过 或是报警 如果能够运行 就要考虑程序堆栈:main中 p=f(y)将y复制到f的堆栈空间 f的堆栈空间在main的上面 当f返回时堆栈的指针会下移但是并不会清理堆栈的内容 所以返回的指针会指向f的堆栈空间 这时f的堆栈空间未被破环 但是后面的printf也是需要在main的堆栈空间上建立堆栈空间的printf的传参过成中是会进入f的堆栈空间 但是幸运的是传参是 (*p).a,p->b 这两个东西和f在堆栈遗留的东西相同所以将正确的值打印出来了 如果在printf后面再加几个参数可能就不行...
回复

使用道具 举报

千问 | 2011-9-10 10:25:06 | 显示全部楼层
x.a=100;x.b='C';px=&x;p=f(y)传进去的y的值都没用过...
回复

使用道具 举报

千问 | 2011-9-10 10:25:06 | 显示全部楼层
是100和C,因为y是存在的不释放的,传入f()函数后相当于给y多加了一个名字x(一个变量可以有多个名字,能这么理解),p为更改后的y的地址,(*p).a相当于y.a。...
回复

使用道具 举报

千问 | 2011-9-10 10:25:06 | 显示全部楼层
必须是100和C啊,虽然函数返回了,也就是x出了作用域不能用了,但是仍然有指向它的指针p(内存地址),顺着它的地址就找到他了 .。。补充:神马叫存储单元释放?就是你找不到这个内存单元了?为什嘛找不到了?你以前用来找它的标记(比如说变量名,指针,地址……)都出了作用域不能使了。可是这个程序里p里边存的是那个内存单元的地址啊,p有在作用域内使用的,有地址...
回复

使用道具 举报

千问 | 2011-9-10 10:25:06 | 显示全部楼层
雾明冰清 说的是对的。...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行