为什么不能这样传递指针
void GetMemory(char *p)
{
p=(char *)new char[100];
}
int main(int argc, char* argv[])
{
char *str=NULL;
GetMemory(str);
strcpy(str,"hello"); //非法内存
printf("str:%s\n",str);
getchar();
return 0;
}
问题点数:20、回复次数:20Top
1 楼kvls(冰茶)回复于 2004-09-03 10:52:40 得分 2
void GetMemory(char *p)修改为void GetMemory(char *&p)Top
2 楼pomelowu(羽战士)回复于 2004-09-03 10:57:58 得分 2
用指针的指针,或者这样理解,用指向一个字符串的指针
void GetMemory(char ** p);
GetMemory(&str);Top
3 楼McuPlayer(编程浪子)回复于 2004-09-03 11:02:33 得分 2
为什么放着好好的简单办法不用?
char* GetMemory()
{
return (char *)new char[100];
}
Top
4 楼autoegg(哲学指引生活 && (动心忍性,增益其所不能))回复于 2004-09-03 11:19:23 得分 2
还是推荐McuPlayer(编程浪子)的方法,这是最常用的。Top
5 楼kvls(冰茶)回复于 2004-09-03 11:37:46 得分 2
不,推荐使用void GetMemory(char *&p)或者void GetMemory(char **p)Top
6 楼Paris_Luo(不懂)回复于 2004-09-03 11:42:01 得分 2
改成这样,用指针引用
void GetMemory(char * &p)
{
p=(char *)new char[100];
}Top
7 楼weakwater(我是河南人)回复于 2004-09-03 12:08:28 得分 0
关注
有人解释一下楼主怎么错了吗?Top
8 楼wjjssnew(暗恋一个叫张文玲的女孩)回复于 2004-09-03 12:52:36 得分 0
推荐 编程浪子的方法..
方便以后排错..养成好习惯也很重要啊:)Top
9 楼ZHANG9652(剑神独孤求败)回复于 2004-09-03 13:16:26 得分 2
void GetMemory(char *p)
记得高质量c++编程指南上好像是这么说的,形参char *p,在程序体内,编译器实际上是会产生一个替代的临时变量比如pp去代这个变量,所以
p=(char *)new char[100];
实际是pp=(char *)new char[100];
所以开辟的动态内存与p是没啥关系的,
也许俺记错了,但是我一般都是用双重指针来做这事的Top
10 楼pomelowu(羽战士)回复于 2004-09-03 13:17:02 得分 2
各位,new的时候有可能内存出错,都没有考虑的。不管哪种返回方式,都需要考虑这个才是好的方式。
“有人解释一下楼主怎么错了吗?”
因为
GetMemory(str);Top
11 楼pomelowu(羽战士)回复于 2004-09-03 13:19:29 得分 2
汗~~~还没写完呢~~~
因为:
GetMemory(str); //把str传进去,str是一个指针,而他实际上是一个int
void GetMemory(char *p) // p是str的一个副本
{
p=(char *)new char[100]; // p的值改变,但是str的值并没有改变。
}
Top
12 楼crybird(寒号鸟)回复于 2004-09-03 13:21:58 得分 0
ZHANG9652(剑神独孤求败) 正解
提示:只有new,没有delete么Top
13 楼pomelowu(羽战士)回复于 2004-09-03 13:22:21 得分 0
而双重指针为什么就可以了呢:
GetMemory(&str); //把str的地址传进去
void GetMemory(char ** p) // p是str地址的一个副本
{
*p = (char *)new char[100]; // p指向的值改变,也就是str的值改变。
}Top
14 楼iicup(双杯献酒)回复于 2004-09-03 13:24:05 得分 2
楼主错误在于,他认为
void GetMemory(char *p);
中的p“就是”
GetMemory(str);
中的str
但p“不是”str,它只是“等于”str
就象:
int a = 100;
int b = a;// 现在b等于a
b = 500; // 现在能认为a = 500 ?
显然不能认为a = 500,因为b只是等于a,但不是a!
当b改变的时候,a并不会改变,b就不等于a了。
因此,虽然p已经有new的内存,但str仍然是null
Top
15 楼pomelowu(羽战士)回复于 2004-09-03 13:26:51 得分 0
楼上说的是,还有就是如果按楼主以前的代码,p会在函数返回的时候销毁,但是分配的空间却仍然存在,没有办法delete。Top
16 楼allenq(黑夜给我黑的眼, 我却用他来翻白眼..........)回复于 2004-09-03 13:33:27 得分 0
答:程序崩溃。
因为GetMemory 并不能传递动态内存,
main 函数中的str 一直都是NULL。
strcpy(str, "hello world");将使程序崩
溃。Top
17 楼iamzxx()回复于 2004-09-03 14:18:37 得分 0
执行GetMemory(str);时系统分配了临时内存用于p=(char *)new char[100];
函数返回时,临时内存清除,该指针丢失.而STR还是为NULL
Top
18 楼iamzxx()回复于 2004-09-03 14:23:50 得分 0
GetMemory(char *p)
改为GetMemory(char **p)
Top
19 楼McuPlayer(编程浪子)回复于 2004-09-15 22:56:48 得分 0
1、指针是C的精华
2、程序简单最美Top
20 楼dhbo(沉默的石头)回复于 2004-09-16 12:40:24 得分 0
应该说,搂主还是值传递的
str= NULL ;这个现实一直没有变过,而:
void GetMemory(char *p)
{
p=(char *)new char[100];
}
只是改变的str得一个拷贝的内存的变化,在这个函数调用过后,*p会释放,但是new的内存没有释放,会有内存泄漏
如果用
void GetMemeory(char *&p)
是引用传递,指向的是同一快内存区域,这样会成功的
而
void GetMemory(char **p) ;
是地址的传递,也会成功
Top




