免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2384 | 回复: 9

关于用参数传递内存的问题 [复制链接]

论坛徽章:
0
发表于 2011-11-13 11:37 |显示全部楼层
今天学习内存分配的内容,看到这有点晕了,我想问下,为什么不可以啊,下面作者的解释有点看不明白,为什么修改副本就不修改p 了





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

示例4-1 试图用指针参数申请动态内存
----------------------------------
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并不能输出任何东西。

论坛徽章:
0
发表于 2011-11-13 11:46 |显示全部楼层
本帖最后由 三月廿七 于 2011-11-13 11:50 编辑

...

论坛徽章:
0
发表于 2011-11-13 12:43 |显示全部楼层
随便谈谈吧,这里其实还是一个最最基础的问题。就是指针的用法和什么是指针的问题。
看代码来说:
  1. void GetMemory(char *p, int num)
  2. {
  3.   p = (char *)malloc(sizeof(char) * num);
  4. }
复制代码
这个函数你注意他的参数列表void GetMemory(char *p, int num)这里的p是一个指针变量。根据函数参数的定义你可以理解,
这里的p和num两个参数都是传值进去,也就是说调用函数后,一份本地的COPY被该函数保留了。那么你只能使用这个局部的COPY进行使用
而不能对齐进行修改。其实,可以更加直观点你把char *顶一个一个别名typedef char * PCHAR,那么函数列表变为void GetMemory(PCHAR p, int num)
这样就可以简单的把p和num看为同样的效果了。

那么如果你想对p进行修改,应该如何做呢?其实还是一个指针的问题。你应该定义为传递进该函数的是一个指针,而不是他的COPY。所以,如下:
void GetMemory(char **p, int num)或者void GetMemory(char *&p, int num),这样都是可行的,函数内部就可以对(*p)看为一个整体进行修改了
比如:
  1. void GetMemory(char **p, int num)
  2. {
  3. *p = new char[100];
  4. }
  5. void GetMemory(char *&p, int num)
  6. {
  7. p = new char(100);
  8. }
复制代码
回复 1# 好喜儿

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
发表于 2011-11-13 14:39 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2011-11-13 14:43 |显示全部楼层
回复 4# pmerofc


    看的不是书,是网上搜的一篇帖子~

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
发表于 2011-11-13 14:48 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2011-11-13 14:49 |显示全部楼层
回复 3# samzc2010


    哦,认真的阅读了一下,明白了。恍然觉得这和以前最开始学习值传递的时候是一个道理,只不过这次传递要修改的是指针~~换了一种形式而已。太谢谢您了~~

论坛徽章:
0
发表于 2011-11-13 14:54 |显示全部楼层
回复 6# pmerofc


     恩,那帖子确实把我绕晕了,其实这就是个传递的问题,只不过像我这样的初学者遇到的最多的是调用函数修改普通变量,这次遇到指针一下没绕过来了,这次记住了~~上次也是您帮我解答我的问题,谢谢您咯。

论坛徽章:
0
发表于 2011-11-13 15:13 |显示全部楼层
呵呵,他帖子里讲的道理是正确的。只不过这里的确容易让初学者迷糊。针对性的强化理解学习下下次就清楚了。
回复  pmerofc


     恩,那帖子确实把我绕晕了,其实这就是个传递的问题,只不过像我这样的初学者遇到 ...
好喜儿 发表于 2011-11-13 14:54

论坛徽章:
0
发表于 2011-11-13 21:23 |显示全部楼层
支持三楼,讲得有理》
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP