问题描述:动态内存传递错误
代码描述:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
//malloc
void getMemory( char * p )
{
p= (char*)(malloc(100));
}
int main(void)
{
char*p = NULL;
getMemory(p);
strcpy(p,"Hellow");
printf("%s",p);
free(p);
return0;
}
编译通过,运行时崩溃,调试时发现p值为空,难道是申请内存失败?goole后恍然大悟!
指针作为函数参数时,是按值传递方式,编译器会产生p 的一个副本假设为_p,并使_p=p;这样其实函数内使用的其实并不是p本身,因此p = (char*)(malloc(100));其实是:_p = (char*)(malloc(100));跟p没有关系。所以p的值在调用函数前后根本就没有改变,其值还是初始化时的NULL,所以就导致内存的非法操作。
解决方法有很多,使用引用传递方式解决为:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
//malloc
void getMemory( char *& p )
{
p= (char*)(malloc(100));
}
int main(void)
{
char*p = NULL;
getMemory(p);
strcpy(p,"Hellow");
printf("%s",p);
free(p);
return0;
}