赞
踩
首先,写代码的时候,写出类似如下的代码,最后出现了段错误:
#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的操作也将会生效。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。