在项目里面遇见一个问题类似如下:
void funcA(char* result)
{
result = (char *)malloc(10 * sizeof(char));
memset(result, 0, 10);
}
void funcB(char *a)
{
......
}
void main(void)
{
char *aaa = NULL;
funcA(aaa);
funcB(aaa);
free(aaa);
}
在调用funcB的时候,aaa的指针仍然为NULL。
具体原因,函数的形参为指针,此时将复制实参指针。与其他非饮用类型的形参一样,该类型形参的任何改变也仅作用于局部副本。如果函数将新指针赋给形参,主调函数使用的实参指针的值并没有改变。实际上被复制的指针只是影响指针的赋值。如果在被调用函数中修改了被指向的对象,即指针所指向的地址处的内容时,由于调用函数中的被复制的指针依然指向这块地址,所以,造成了返回后原指针所指向的对象的值的改变。如果在被调用函数中对指针本身进行任何操作,其实都不会对调用函数中的指针造成任何的修改。
解决此类问题的方法:
(1)
char* funcA(void)
{
char *rtn = (char *)malloc(10 * sizeof(char));
return rtn;
}
void funcB(char *A)
{
......
}
void main(void)
{
char *aaa = funcA();
funcB(aaa);
free(aaa);
}
(2)
void funA(char** result)
{
*result = (char *)malloc(10 * sizeof(char));
}
void funcB(char *A)
{
......
}
void main(void)
{
char **aaa = NULL;
funcA(&aaa);
funcB(aaa);
free(aaa);
}