简单问题!
void GetMemory(char * p)
{
p=(char *)malloc(100);
}
void Test(void)
{
char * str=NULL;
GetMemory(str);
strcpy(str,"hello, world");
printf(str);
}
调用Test()为何无结果?
问题点数:20、回复次数:6Top
1 楼oopig(面向对象的猪)回复于 2003-09-03 23:02:50 得分 3
因为Getmemory创建的内存指针没有传出去。
void GetMemory(char **p)
{
*p=(char *)malloc(100);
}
void Test(void)
{
char * str=NULL;
GetMemory(&str);
strcpy(str,"hello, world");
printf(str);
}
Top
2 楼jiangpeng(Mr. J)回复于 2003-09-03 23:03:56 得分 2
void GetMemory(char** p)
{
*p = (char *)malloc(100);
}
void Test(void)
{
char* str=NULL;
GetMemory(&str);
strcpy(str, "hello, world");
printf(str);
}
Top
3 楼CslQy(LionHeart)回复于 2003-09-03 23:06:00 得分 3
应该不是没有结果吧?应该是发生内存错误。
问题在GetMemory()上,如果想在一个函数里面申请空间的话,应该用双指针,程序改为
void GetMemory(char ** p)
{
p=(char *)malloc(100);
}
void Test(void)
{
char * str=NULL;
GetMemory(&str);
strcpy(str,"hello, world");
printf(str);
}
就可以了。Top
4 楼riverboat(诸葛不亮)回复于 2003-09-03 23:12:28 得分 2
用引用吧,调用起来比较自然,呵呵:
void GetMemory(char * &p) // 这里加一个
{
p=(char *)malloc(100);
}
void Test(void)
{
char * str=NULL;
GetMemory(str);
strcpy(str,"hello, world");
printf(str);
}
Top
5 楼bensu(变术)回复于 2003-09-03 23:16:36 得分 10
void GetMemory(char * p)
{
p=(char *)malloc(100);//这里申请的内内并不能传给str
}
void Test(void)
{
char * str=NULL;
GetMemory(str);
strcpy(str,"hello, world");
printf(str);
}
毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。
如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”.
见议你看一下林锐的<高质量C++编程>.
Top
6 楼jiangpeng(Mr. J)回复于 2003-09-03 23:17:18 得分 0
楼上的大哥,C里面那来的引用,不要以为这里的问题都是C++的Top



