免费注册 查看新帖 |

Chinaunix

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

利用参数分配内存的问题~~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-10-22 14:47 |只看该作者 |倒序浏览
方法一:
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";       // 运行错误

}

方法二:
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);  

}
为什么第二中方法就行的通,而第一种不能呢?

论坛徽章:
0
2 [报告]
发表于 2003-10-22 15:01 |只看该作者

利用参数分配内存的问题~~~

第一种不行的。malloc是在GetMemory()中动态分配的内存,也就是在堆上。好像不能带出这个函数的!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2003-10-22 15:31 |只看该作者

利用参数分配内存的问题~~~

在第一种方法里,你把str当作实参传进去,
它的值不会改变。要想改变它的值,只有
用指向str的指针当作参数传进去。潭浩强
的书说的很清楚。

论坛徽章:
0
4 [报告]
发表于 2003-10-22 15:45 |只看该作者

利用参数分配内存的问题~~~

楼主提供的代码似乎是林锐写的《高质量c/c++编程指南》里的,很熟悉哦,
同意楼上的观点

论坛徽章:
0
5 [报告]
发表于 2003-10-22 15:49 |只看该作者

利用参数分配内存的问题~~~

那我想问一下,在一个子函数执行结束时候,在它里面动态开辟的内存空间
还存在不存在??也就是说,楼主的第一种写法得到的内存空间安全吗?谢谢啦!

论坛徽章:
0
6 [报告]
发表于 2003-10-22 15:55 |只看该作者

利用参数分配内存的问题~~~

动态开辟的内存空间在程序运行期间是一直存在的,不管它在主函数还是在子函数,除非调用free()释放。
楼主的第一种写法在执行malloc时就segment deault了,“得到内存空间的说法”不成立

论坛徽章:
0
7 [报告]
发表于 2003-10-22 15:58 |只看该作者

利用参数分配内存的问题~~~

感谢!多学了一招。

论坛徽章:
0
8 [报告]
发表于 2003-10-22 16:00 |只看该作者

利用参数分配内存的问题~~~

想从子函数里面分配内存,再传出来,需要用指针的指针。
char **p
*p=(char *) malloc(255);

论坛徽章:
0
9 [报告]
发表于 2003-10-22 16:04 |只看该作者

利用参数分配内存的问题~~~

函数参数的值传递方式是单向的,只能传入,不能传出的啊。

论坛徽章:
0
10 [报告]
发表于 2003-10-22 16:10 |只看该作者

利用参数分配内存的问题~~~

大家学习C语言学的太死了,c语言的函数调用是安值传递参数。

主调函数把实参的值,放到被调函数的栈里(可以理解成拷贝),在第一个例子中*P其实和一个int是一样的,在被调函数的栈里开4个字节的空间,只是把值传过来了,其实 p = malloc的p是在被调函数的栈里。

而第二个例子, *p = malloc,这个*p才是在主调函数中定义的那个指针变量呢,为什么呢,因为**p,是把指向这个地址的地址传过去了, 而用*(同过地址)来访问
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP