免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2908 | 回复: 11
打印 上一主题 下一主题

[C] 关于C语言中内存管理的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-24 11:11 |只看该作者 |倒序浏览
请教各位:  程序如下:

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

void Test(viod)
{
  char *str=NULL;
  GetMemory(str, 100);
  strcpy(str, "hello");
}

作者要求是让str获得期望的内存,但str最后旧是NULL;

我看过资料是这样解释的:

编译器总是要为函数的第个参数制作临时副本,指针参数P的副本是_P,编译器使_P=P
只有改变了_P的内容才会使指针参数P的内容也作相应的修改,

我的疑问是:p=(char *)malloc(sizeof(char)*n);  这个语句不就是改变了P的内容吗,指针的内容不就是地址吗,而这个语句就是将申请到的内存的首地址赋给P啊,而P的内容不就改变了吗?

就这个搞不懂,希望高手点拔一下,小生不才,谢谢名位.

论坛徽章:
0
2 [报告]
发表于 2006-04-24 11:16 |只看该作者
建议参数用**p
C/C++高质量编程详细的介绍了这点
http://man.chinaunix.net/develop/c&c++/c/c.htm

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2006-04-24 11:17 |只看该作者
原帖由 anhongkui 于 2006-4-24 11:16 发表
建议参数用**p
C/C++高质量编程详细的介绍了这点
http://man.chinaunix.net/develop/c&c++/c/c.htm

不是建议,是一定

论坛徽章:
0
4 [报告]
发表于 2006-04-24 11:30 |只看该作者
致一楼:我知道要用**P,

但是我现在急需要解决的问题是,搞不懂,为什么在一楼所说的那个文章里面,P的内容为什么没有变,原理在哪里,谢谢!

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2006-04-24 11:31 |只看该作者
原因在于这个p和你传进去的那个p已经不是同一个p了,你需要使用第一个p,然而却在修改另外一个p

论坛徽章:
0
6 [报告]
发表于 2006-04-24 12:11 |只看该作者
原帖由 cjaizss 于 2006-4-24 11:31 发表
原因在于这个p和你传进去的那个p已经不是同一个p了,你需要使用第一个p,然而却在修改另外一个p




那你的意思是说,主要还是调用函数是一个没有返回值的函数,所以不行,

而在另一个方法中引用**p,我也有不理解的,这个是通过改变指针的值来改变str 的,我想请教一下:

本身在主函数定义时str是一个指针,而在调用时用&str为作实参给调用函数,在这里,&str可以说是指针变量str的地址,但如何来表示呢,和他对应的形参**p,应该是*p是什么意思在这个函数中



在线等,谢谢指点

论坛徽章:
0
7 [报告]
发表于 2006-04-24 14:41 |只看该作者
楼主 好像是我同事。。。。。快闪

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
8 [报告]
发表于 2006-04-24 14:43 |只看该作者
在C语言的函数调用里,你传进的任何一个变量,都是经过copy的翻版,也就是已经不是原来的那个变量了

论坛徽章:
0
9 [报告]
发表于 2006-04-24 16:33 |只看该作者
原帖由 cjaizss 于 2006-4-24 14:43 发表
在C语言的函数调用里,你传进的任何一个变量,都是经过copy的翻版,也就是已经不是原来的那个变量了


是的.
参数与局部变量都在函数自己的栈贞里

论坛徽章:
0
10 [报告]
发表于 2006-04-24 17:04 |只看该作者
编译器总是要为函数的第个参数制作临时副本,指针参数P的副本是_P,编译器使_P=P
只有改变了_P的内容才会使指针参数P的内容也作相应的修改,
我的疑问是:p=(char *)malloc(sizeof(char)*n);  这个语句不就是改变了P的内容吗,指针的内容不就是地址吗,而这个语句就是将申请到的内存的首地址赋给P啊,而P的内容不就改变了吗?

我的一点想法,不一定对:
资料的说法,只有改变了_P的内容才会使指针参数P的内容也作相应的修改。他的意思应该是说,改变了_p所指向的内存单元里面的数据,才会引起p所指向的内存单元数据的改变,而不是本身p所指向的内存地址的改变。

在你的例子中,malloc后只是改变了_p所指向的内存的地址,并没有改变p所指向的内存地址,所以会产生内存泄露。
一点愚见。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP