一、问题
如下2个函数
void GetMemory(char *p,int num)
{
p=(char*) malloc( sizeof(char)*num );
}
void Test(void)
{
char *str=NULL;
GetMemory(str,100); //str仍然是NULL
strcpy(str,"hello"); //运行错误
}
注意:在进行函数GetMemory的调用时,str的值(一个指针)的一份拷贝传递给形参p,形参p的改变并不会影响到str的值。
二、解决方案
改进方案1:用传指针的方式
void GetMemory(char **p,int num) //指向指针的指针,即二维指针
{
*p=(char*) malloc( sizeof(char)*num );
}
void Test(void)
{
char *str=NULL;
GetMemory(&str,100); //这样对*p进行修改就等同对str进行修改
strcpy(str,"hello");
free(str);
}
改进方案2:由于二维指针层次不好理解,我们可以使用返回值返回分配的内存地址char* GetMemory(int num)
{
char *p = (char*) malloc( sizeof(char)*num );
return p;
}
void Test(void)
{
char *str=NULL;
str = GetMemory(100);
strcpy(str, "hello");
free(str);
}
错误方案:
char *GetString()
{
char *p="hello world";
return p;
}
void Test(void)
{
char *str=NULL;
str = GetString();
}
由于p指向的是常量字符串,在静态存储区中,所以无论什么时候调用GetString返回的都是同一个字符串指针,指向一块“只读内存”。