读书人

请问内存的思考题

发布时间: 2012-04-13 13:50:24 作者: rapoo

请教内存的思考题
今天看高质量C、C++ 看见一个内存的思考题 有些不理解 请教各位
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
程序崩溃。这个还可以理解,因为将指针str的传给p 但是值传递所以Test函数中的str值一直为NULL;

疑问一: 但是形参用指向指针的指针就可以,如下 这和上面有什么不同之处么
void GetMemory(char **p, int num) //形参用指向指针的指针**p
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}

疑问二: 对于下面的一个例子,虽然可以输出hello 但是由于没有释放malloc申请的空间,造成内存泄露,这怎么解决?

[解决办法]
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
p在函数体里其实是一个副本_p,p = (char *)malloc(100)只是为_p分配了空间,而p没有。

void GetMemory(char **p, int num)
{
*p = (char *)malloc(num);
}
副本_p是char **的,_P和p指向的地方相同,所以为*_P分配空间也是为*分配空间,也就是char*
[解决办法]

探讨

还是没明白 谁能说明白点?

[解决办法]
&str是指指针变量的地址
探讨
主要是指针的指针这块的表达太容易混了

现在我基本明白了
void GetMemory(char **p)
{
*p = (char *)malloc(100);
}
其实p就是指针变量str的地址 用*p其实就将str的值变了
在main函数中 strcpy语句中使用str的过程应该是有str去寻找str所在地址中的值
这样实际就把str给改变了



引用 1……

读书人网 >C语言

热点推荐