| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付买域名,送MP3、MP4
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY买空间,免费送域名(厦门中资源)
共有 169 人关注过本帖
标题:指针参数传递内存
收藏  订阅  推荐  打印 
yinliwen110
Rank: 1
等级:新手上路
帖子:15
积分:278
注册:2008-6-30
指针参数传递内存

如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例7-4-1中,Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,为什么?

void GetMemory(char *p, int num)
{
    p = (char *)malloc(sizeof(char) * num);
}

void Test(void)
{
    char *str = NULL;
    GetMemory(str, 100);    // str 仍然为 NULL  
    strcpy(str, "hello");   // 运行错误
}

毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。

对后面的解释不是很了解,哪位高手能更详细或具体点吗?谢谢
搜索更多相关主题的帖子: 参数  指针  内存  
2008-9-16 02:55
rhindw
Rank: 1
等级:新手上路
帖子:1
积分:110
注册:2008-9-16

个人感觉那个p指针就是一个局部变量,过了生存期就被释放了,所以后面还是NULL... ...
2008-9-16 20:26
xianshizhe111
Rank: 6Rank: 6
等级:金牌会员
帖子:1451
积分:15818
注册:2007-12-8

#include<iostream>
#include<string>
struct CandyBar
    {
        char band[20];
        float weight;
        int calorie;
    };
   

   using namespace std;
     
  void GetMemory(char *p, int num)
{
    p = (char *)malloc(sizeof(char) * num);  /* 确实是分配地址了,但并没有赋值 */
    p = "abc";
}

void Test(void)
{
    char *str = NULL;
    GetMemory(str, 100);    // str 仍然为 NULL  
    strcpy(str, "hello");   // 运行错误     /* 指针初始华之后不允许修改,16位编译器多数可以,标准问题 */
}

  
   
int main(void)
{
    Test();
    return 0;
}
2008-9-17 07:24
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.053226 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved