void GetMemory(char *p, int num)
{
p = (char*)malloc(sizeof(char) * num);
}
void Main(void)
{
char *str = NULL;
GetMemory(str, 100); //其实这样出来的str还不为NULL
strcpy(str, "Hello Word!"); //在运行时是错误的,这还会有一个问题“内存泄漏”,这个词大家肯定不陌生
}
这是为什么呢!因为指针变量也是一样类型,而在GetMemory()参数传递时,只是把这个指针变量的值(地址)传递过去了。可以理解为指针 p 和 str指同一个地址空间,而我再对p开辟新的空间,只是把p的指向修改了,这样不是说str的指向也随着p的修改而修改,str的指向跟p没有任何关系。 所以str指向还是一个NULL空间,而在这个函调用完成以后*p就被释放,但是用malloc()函数开辟的空间是在堆存储空间,只能通过自己用 free()来进行释放,这样就造成了“内存泄漏”。
这个问题有常用的两种解决方法:
方法一:
char* GetMemory(int num)
{
char *p;
p = (char*)malloc(sizeof(char) * num);
return p;
}
方法二:
void GetMemory(char **p, int num)
{
*p = (char*)malloc(sizeof(char) * num);
}
浙公网安备 33010602011771号