先来看一段有问题的code:
void GetMemory(char *p,int num)
{
p = (char *)malloc(sizeof(char)*num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str,100); //str is still NULL
strcpy(str,"hello"); // Run error!
}
问题在于函数GetMemory(),编译器总是要为参数的每个参数制作临时副本,指正参数p的副本是_p,编译器是_p=p。在此函数中,_p申请了新的内存,只是把本身的值改变了,即指向了新的内存空间,但p本身未变(修改了_p的值而不是_p指向的对象),事实上运行此函数后还会造成内存泄露。
如果非得用指针参数去申请内存,可改用“指向指针的指针‘或”指针的引用“:
void GetMemory2(char **p, int num) // or (char *& rp,int num)
{
*p = (char*)malloc(sizeof(char)*num);
}
或者可以通过返回值来传递动态内存,更简单:
char* GetMemory3(int num)
{
char *p = (char*)malloc(sizeof(char)*num);
return p;
}
char* GetString(void)
{
char p[] = "hello world";
return p; // this memory will be freed after the func is called and run over
}
但不同的是:
char* GetString(void)
{
char *p= "hello world";
return p;
}
此函数是可以的,因为此时p指向内容作为常量字符串“hello world",位于静态存储区,在程序生命周期内始终有效,但不建议这样的用法。