首先,写代码的时候,写出类似如下的代码,最后出现了段错误:
#define SIZE 10
void EncryptUpdata(int *ctx)
{
ctx = (int *)malloc(sizeof(int) * SIZE);
return;
}
int main() {
int *ctx = NULL;
EncryptUpdata(ctx);
UseCTX(ctx);
return 0;
}
写出这样的代码,主要是对函数参数传递的本质没有很深的了解。最关键的一点就是,永远要记住,形参是一个副本传递,若要修改形参的值那么请用一级指针,若要修改形参一级指针的值那么用二级指针,以此类推。
这边举一个想要修改一级指针值的例子:
void GetMemery(int **p)
{
/*申请1024个int大小*/
*p = malloc(sizeof(int)*1024);
if(NULL == *p)
{
printf("malloc failed\n");
*p = NULL;
}
}
int main(void)
{
int *p = NULL;
GetMemery(&p);
printf("address of p is %p\n",p);
free(p);
p = NULL;
return 0;
}
可以借助下图来理解,调用GetMemery之前,会创建一个二级指针的副本,这没关系,因为二级指针的副本是指向原始指针p的,这样你对指针p的操作也将会生效。