免费注册 查看新帖 |

Chinaunix

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

关于指针--求解。 谢谢!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-29 16:57 |只看该作者 |倒序浏览
指针参数是如何传递内存的?
如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例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"); // 运行错误

}


示例7-4-1 试图用指针参数申请动态内存


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

如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”,见示例7-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);

}


示例7-4-2用指向指针的指针申请动态内存


由于“指向指针的指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。这种方法更加简单,
==================

不明白 GetMemory2 就可以了呢?
我认为一样的结果呀,那位给解惑呀。  谢谢!!!

[ 本帖最后由 laosui 于 2006-4-29 17:09 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-04-29 16:57 |只看该作者
这是关于  高质量C   中的一段。  谢谢。

论坛徽章:
0
3 [报告]
发表于 2006-04-29 17:04 |只看该作者
因为参数是一个指针,他不存放任何值,也没有空间存放任何值
所以动态分配的内存指针不能给它,我是这样理解的!

论坛徽章:
0
4 [报告]
发表于 2006-04-29 17:07 |只看该作者
还是不能理解。 。。。

论坛徽章:
0
5 [报告]
发表于 2006-04-29 17:16 |只看该作者
搞不定, 帮忙呀。。。。。

论坛徽章:
0
6 [报告]
发表于 2006-04-29 17:18 |只看该作者
void GetMemory(char *p, int num) ;
函数自动为p建一个临时变量,这时的P和Test里的P不是一个
就是说,这里的地址*p不是TEST里的*p,申请的空间和Test里的*P没关系.

void GetMemory2(char **p, int num) ;
这里的p和Test2里的p不是一个,但是值相同,所以*p是同一个地址

不知道说明白了没有

我也是菜鸟

论坛徽章:
0
7 [报告]
发表于 2006-04-29 17:30 |只看该作者
在void GetMemory(char *p, int num)中,赋值是这样进行的:
     *p=str;//让p和str指向同一地址
     p = (char *)malloc(sizeof(char) * num); //让p又去指向另一块地址。

搞来搞去,str没有变,都是p在折腾,而且在最后返回的时候还被释放了。

而在void GetMemory2(char **p, int num)中:

     **p=&str;//也就是*p=str。
     *P=str=(char *)malloc(sizeof(char) * num);//让str指向malloc地址。

OK?

[ 本帖最后由 sealdad 于 2006-4-29 17:43 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-04-29 17:37 |只看该作者
就是由於傳的是值不是指針(指針也是值),應該做過那個實現一個函數交換a,b的值的問題吧,仔細想想就明白了,實在不行就畫個圖.
也可以這樣:
char* GetMemory(char *p, int num)

{

p = (char *)malloc(sizeof(char) * num);

return p;
}

void Test(void)

{

char *str = NULL;

str=GetMemory(str, 100);

strcpy(str, "hello");

}

论坛徽章:
0
9 [报告]
发表于 2006-04-30 08:53 |只看该作者
6 楼说的好像有道理。 但是。。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP