1.题目
以下代码有问题吗?如果有,是什么问题,怎么改正?
void getmemory( char *p )
{
p = (char *) malloc( 100 );
}
void test( void )
{
char *str = null;
getmemory( str ); //复制传递
strcpy( str, "hello world" );
puts( str );
}
2.正确答案:
void getmemory( char **p ) //*p改为**p,形参也要设置为二级指针即**p,&str通过地址传递给**p
{
*p = (char *) malloc( 100 ); //p改为*p
}
void test( void )
{
char *str = NULL;
getmemory( &str ); //str改为&str,地址传递,函数getmemory函数得到str的地址,&str为二级指针
strcpy( str, "hello world" );
puts( str );
}
3.分析
函数getmemory中,malloc申请的内存地址给了p指针,但是这个指针是一个局部变量,不会影响到函数test中的指针str。所以在test函数中使用strcpy和puts时,str指向的地址是随机的,会导致程序崩溃以及未知错误。
getmemory( str );这句采用的是复制传递,在函数中改变形参的值不会影响实参。因此需要改成地址传递,即getmemory( &str );
同时函数也需要改一下,改为void getmemory( char **p ){*p = (char *) malloc( 100 );}。此时str的得到内容即为malloc申请的地址。使用地址传递时,函数getmemory函数得到的是str的地址。str本身就是一个空指针,str存的是一个空地址。因此此时&str为二级指针,getmemory的形参也要设置为二级指针即**p。此时&str通过地址传递给**p,str就等于*p,因为要给str赋值malloc开辟的新空间返回主函数test,即*p=(char *)malloc(100);
》》》》》》》》本文章为个人学习记录之用,如有错误望大家告知,谢谢!《《《《《《《《
文章讨论了C语言中关于内存分配和指针传递的问题。原始代码在`getmemory`函数中使用malloc分配内存后,由于采用了复制传递,导致`test`函数中的`str`指针未能正确指向分配的内存。解决方案是通过二级指针进行地址传递,修改`getmemory`函数接收二级指针参数,并在`test`函数中传递`str`的地址,从而确保内存分配的结果能在函数外部生效,防止程序崩溃和未知错误。

7万+

被折叠的 条评论
为什么被折叠?



