赛迪网 > IT技术 Linux > 最新更新
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

Linux编程C++内存管理的指针传递详解 (1)

发布时间:2006.09.26 07:07     来源:gsdn.net    作者:tag









指针参数是如何传递内存的?

如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例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释放内存。

如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”,见示例4.2。

void GetMemory2(char **p, int num)
{
 *p = (char *)malloc(sizeof(char) * num);
}
void Test2(void)
{
 char *str = NULL;
 GetMemory2(&str, 100); // 注意参数是 &str,而不是str
 strcpy(str, "hello");
 cout<< str << endl;
 free(str);
}

示例用指向指针的指针申请动态内存

1 2 3 4 下一页>>


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 教你怎样合理的分配Linux系统的内存 (09-25) · 教你怎样加快 Linux系统的数据存取 (09-25)
· Linux系统的内存管理地址映射机制 (09-25) · Linux系统的内存管理的虚拟存储管理 (09-25)
· IBM看上红旗Linux 未来市场是否三国鼎立? (09-25) · Linux编程C++内存管理之内存分配详解 (09-25)
· 嵌入式Linux操作系统CGI程序设计技术 (09-25) · 嵌入式Linux平台的多协议路由器的设计 (09-25)
· Linux嵌入式系统开发平台选型探讨 (09-25) · 商业新浪潮:开源Linux展"众包"的力量 (09-25)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
[政务][电信][金融][农业][制造业][中小企业]
[CIO][ERP][协同][IT管理][中间件][电子商务]
[政策][地方][专家][评估][辞典][博客][社区]
· 专家:从第三方法律服务看我国信息化法制建设
· 信息化的边际效益分析:民营企业不上ERP会怎样
· 特别专题:排队时代电子银行如何补上行业短板
· 股市洪峰背后的IT:信息系统如何应对负载考验
· 案例分析:计划不如变化快 IT该不该实施预算制
· 北京:公交卡用途增多可购物买药 不推行实名制
  博客·论坛 ·曾剑秋·项立刚·Java学习·网管