| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2569 人关注过本帖
标题:有关 函数调用和内存分配 的问题!
取消只看楼主 加入收藏
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
有关 函数调用和内存分配 的问题!
这时书上的一个例子,代码如下:
程序代码:
#include <stdio.h>

long * IncomePlus(long *);

int main(void)
{
    long your_pay = 30000L;
    long * pold_pay = &your_pay;
    long * pnew_pay = NULL;

    pnew_pay = IncomePlus(pold_pay);

    printf("\nOldpay = $%ld", * pold_pay);
    printf("\nNewpay = $%ld", * pnew_pay);

    //printf("\nNewpay = $%ld", * pnew_pay);
    //printf("\nOldpay = $%ld", * pold_pay);
    //printf("\nOldpay = $%ld, Newpay = $%ld", * pold_pay, * pnew_pay);

    printf("\n\n");
    return 0;
}

long * IncomePlus(long * pPay)
{
    long pay = 0;
    pay = * pPay + 10000L;
    return &pay;
}

问题是:
1.函数 Incomeplus()中创建的变量 pay, 在函数调用结束后系统分配给它的内存有没有被释放?有没有被其他程序使用?pay 分配的内存是在堆中?还是堆栈中?
2.程序运行时,现实 Newpay 是一个垃圾值, 但是如果交换两个 printf 语句的顺序,或者将两个输出合并成一个输出, 输出貌似是正确的,这是为什么?跟内存分配有啥关系?

希望高手能指点一下,谢谢了!!!
2014-05-19 10:26
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
收藏
得分:0 
回复 2 楼 wp231957
这是书上的一个代码,确实是有问题的,但是我想知道错在哪里,书上解释的不是很清楚!
2014-05-19 11:05
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
收藏
得分:0 
回复 5 楼 embed_xuel
在《C语言入门经典》第四版中第八章有这么一个例子,但是书上解释的不清楚,尤其是为什么合并两个printf()语句后输出是正常的,我尝试交换两个printf()的顺序输出也是正常的,那本书解释的模棱两可!
2014-05-19 14:12
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
收藏
得分:0 
回复 6 楼 TonyDeng
谢谢你的答复,关于局部变量在栈上的操作你讲的很详细,我看懂了八九成,我尝试了在两个printf 前面插入了其他无关的语句,输出变化了,数据是垃圾值!
这是不是说明,之前交换输出顺序,先输出new_pay正确是因为还没有其他函数占用局部变量pay的内存,pay的内存空间暂时是“安全的”,但是如果交换输出顺序,先输出old_pay 或者在输出new_pay之前插入其他语句,那么pay这块空间就被使用了,里面的数据将不是之前存放的数据,会被覆盖,所以输出了垃圾值,以我目前的能力只能理解到这个程度了,还有很多不太懂的地方。
2014-05-19 14:33
快速回复:有关 函数调用和内存分配 的问题!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016009 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved