关于内存分配的,高手进来!

来源:百度知道 编辑:UC知道 时间:2024/06/01 17:24:59
void GetMemory( char *p )
{
p = (char *) malloc( 100 );
}

void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
}
我想知道为什么运行到strcpy程序会出错,是不是GetMemory( str );没有分配内存?请详细解释一下,谢谢了!
调用时传入的p不是地址吗,怎么是按值传递呢?

在C语言中,指针作为函数参数,不会改变指针的地址,就是说如果调用函数前,p=NULL;调用后,依然如此。

解决的办法有两种,其中是用双指针,前面的各位大虾已经给出;另一种是引用:
void GetMemory( char *&p )
{
p = (char *) malloc( 100 );
}

void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
}

楼主的写法,GetMemory( str );分配内存了,但传递不出来
因为void GetMemory( char *p ) 的参数p是传值的,而不是传地址

下面这种写法是传地址的:
void GetMemory( char **p )
{
*p = (char *) malloc( 100 );
}

void Test( void )
{
char *str = NULL;
GetMemory( &str ); //这里是把str的地址传到函数GetMemory中
strcpy( str, "hello world" );
}

更好的写法是这样的:

void *GetMemory(int size )
{
return malloc(size);
}

void Test( void )
{
char *str = NULL;
str=GetMemory(100);
strcpy( str, "hello world" );
}

上面的写法,GetMemory和malloc完全一样了,只是单单对它进行了封装