| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 522 人关注过本帖
标题:函数调用的过程是什么 ,希望给我讲解一下
只看楼主 加入收藏
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
结帖率:81.82%
收藏
已结贴  问题点数:20 回复次数:8 
函数调用的过程是什么 ,希望给我讲解一下
在主函数中调用子函数,那么在子函数调用的过程中,有动态开辟空间的语句,在函数调用结束后这些动态开辟的空间是不是就自动释放了,还是还在保留着;
搜索更多相关主题的帖子: 动态 空间 
2015-04-08 21:09
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:20 
子函数返回后各个局部变量的空间均被释放
但是在子函数中由程序员手工动态开辟的空间是例外
不会自动释放

整个程序结束之前
只要动态开辟的空间的首地址还可通过变量找到
就可释放

动态开辟了空间若没有对应地释放
就会形成内存泄漏

Only the Code Tells the Truth             K.I.S.S
2015-04-08 21:38
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
回复 2楼 longwu9t
谢谢版主!
2015-04-08 21:50
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
我不是版主
不过还是谢谢你的鼓励

以下代码 楼主可以看看 希望有所帮助


程序代码:
/* 在主函数中开辟空间 在子函数里改变动态空间
[color=#0000FF]#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define FREE(p) free(p), p = NULL

const char str[] = "0123456789";

void foo(char *ptr) {
    realloc(ptr, 10 * sizeof(char));
    strncpy(ptr, str, 10);
    ptr[9] = 0;
    FREE(ptr);  
}

int main(void) {
    char p = malloc(5 * sizeof(char));
    foo(p);
    //若是子函数里FREE执行了
    //则p在子函数中已经释放了
    //由于函数是值传递的 p的值没有改变
    //下面语句中 puts被执行 结果是错误的
    //想得正确结果 注释掉子函数中的FREE
    if(p) puts(p); 
    
    FREE(p); //程序结束前 两个FREE之中一个被执行 就不会泄漏

    return 0;
}
[/color]*/

//以上做法不推荐
//下面利用指针的指针来传值 改变动态空间大小和值

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define FREE(p) free(p), p = NULL

const char str[] = "0123456789";

void foo(char **p2) {
    realloc(*p2, 10 * sizeof(char));
    strncpy(*p2, str, 10);
    (*p2)[9] = 0;
    //FREE(*p2); //此行注释 主函数里的puts就能正确执行
}

int main(void) {
    char *p1 = malloc(5 * sizeof(char));

    foo(&p1);
    if(p1) puts(p1);
    FREE(p1);

    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2015-04-08 22:35
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
你好,非常感谢,第一个程序我不太理解的不是从新有分配一段空间给ptr了吗?最后子函数释放的是ptr的新地址,由于是值传递刚开始形参和实参指向同一块地址,是不是在从新分配地址后,实参的地址也变成了形参从新分配的地址?
2015-04-08 23:12
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
回复 5楼 风车转风车89
还是我大意了
写的太快了 就有了漏洞
忘了基本的realloc返回值的问题

我前面给出的代码都有问题
下面的代码是我想表达意图

程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define FREE(p) free(p), p = NULL

const char str[] = "0123456789";

void foo(char **ptr) {
    *ptr = realloc(*ptr, 10 * sizeof(char));
    strncpy(*ptr, str, 10);
    (*ptr)[9] = 0;
    //FREE(*ptr);  
}

int main(void) {
    char *p = malloc(5 * sizeof(char));
    foo(&p);
    
    if(p) puts(p); 
    
    FREE(p); 

    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2015-04-08 23:41
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
如果是全局指针变量的申请了动态空间
释放也是很自由的
也是最省事的办法

程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define FREE(p) free(p), p = NULL

const char str[] = "0123456789";
char *p = NULL;

void foo(void) {
    p = realloc(p, 10 * sizeof(char));
    strncpy(p, str, 10);
    p[9] = 0;
    //FREE(p);  
}

int main(void) {
    p = malloc(5 * sizeof(char));
    strncpy(p, str, 5);
    p[4] = 0;
    puts(p);

    foo();
    if(p) puts(p); 
    
    FREE(p); 
    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2015-04-08 23:47
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
谢谢!真是太耐心了!!!
2015-04-08 23:55
风车转风车89
Rank: 2
等 级:论坛游民
帖 子:125
专家分:45
注 册:2014-9-15
收藏
得分:0 
回复 7楼 longwu9t
第二个程序没有问题吧?因为没在电脑前,没有具体执行看结果
2015-04-09 00:00
快速回复:函数调用的过程是什么 ,希望给我讲解一下
数据加载中...
 
   



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

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