这些问题都是容易引起程序bug的主要原因-------内存问题。
今天就遇到了一个,经过好长时间的分析,才慢慢搞明白这个问题。————
参考《C语言深度剖析》
void GetMemory(char *p, int num)
{
p = (char*)malloc(num * sizeof(char));
}
int main()
{
char *str = "abcdef";
GetMemory(str,10);
strcpy(str,"hellow");
free(str);
return 0;
}
分析:在调用GetMemory(str,10)这个函数后,并没有改变str的内存,也就是说malloc这个函数分配的内存并没有把地址赋给str,而是赋值给_str。而这个_str是编译器自动分配和回收的,我们根本无法使用,所以想获取这段内存是不行的。
补充:在C语言中,所有非数组形式的数据实参均以传值形式调用。(对实参做一备份并传递给调用的函数,函数不能修改作为实参实际变量的值,而只能修改传递给它的那份备份)。
两种方法可以解决:
(1)return
char* GetMemory(char*p, int num)
{
p = (char*)malloc(num*sizeof(char));
return p;
}
int main()
{
char *str = NULL;
str = GetMemory(str,10);
strcpy(str,"Hellow");
free(str);
return 0;
}
(2)二级指针
void GetMemory(char **p,int num)
{
*p = (char*)malloc(num*sizeof(char));
}
int main()
{
char *str = NULL;
GetMemory(&str,10);
strcpy(str,"hello");
free(str);
return 0;
}
分析: 这里传递给函数的参数是&str而非str,即就是传递的是指针的地址,是一个值。在函数内部,用钥匙(*)来开锁:*(&str),其值就是str。所以malloc分配的内存地址是真正的赋值给str本身。