c语言入门经典里的一个简洁的例子,求大神指点,100分!!!

#include<stdio.h>long*incomeplus(long*ppay){longpay=0;pay=*ppay+10000;return&pay;}int... #include<stdio.h>
long* incomeplus(long*ppay)
{
long pay=0;
pay=*ppay+10000;
return &pay;
}
int main(void)
{
long your_pay=30000L;
long*pold_pay=&your_pay;
long*pnew_pay=NULL;
pnew_pay=incomeplus(pold_pay);
//printf("old is %ld , new is %d\n",*pold_pay,*pnew_pay);。。。。。。。。(2)
/*printf("old is%d",*pold_pay);。。。。。。。(1)
printf("new is %d",*pnew_pay);*/。。。。。。。(1)
return 0;
}
该程序原本目的是想输出原来的工资,和加薪以后的工资,分别是30000和40000的,但这个程序显然是个错误的程序,因为这里的被调用函数incomeplus()返回的是其本地变量的地址
但是,在这个例子中,当主函数main里面的printf()输出函数选择第(1)种情况时,错误,大家都明白,于是结果如图

当选择第(2)中输出方式时,结果却!!!求解释,
展开
 我来答
cdyzxy
2014-04-18 · TA获得超过2.1万个赞
知道大有可为答主
回答量:1.4万
采纳率:85%
帮助的人:3741万
展开全部
函数中的变量pay是开设在堆中的,如果采用(2)调用printf时先入栈的是*pnew_pay,正巧这时堆还未被printf冲掉,可以将已废弃的pay位置的值返回;而(1)由于先调用了一遍printf堆中的pay位置数据被用作其他而值被改过了,所以不对。
依此,你在(1)中将两个printf颠倒一下有可能还是能输出正确的值的。
更多追问追答
追问
请问关于这个知识点的内容会出现在c语言入门经典的大概什么地方或者说书上会提到吗,我目前还没学到这相关的内容,我学过动态内存分配的内容,我只知道动态内存分配的是堆内存里面的。
追答
这个知识点不属于c范畴,属于编译原理。总之这样的用法是错误的,你应当有这个概念:在子程序中申请的存储区退出子程序后就不可以用了,除非用static修饰的。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式