一、返回栈区地址
int *fun() { int a = 10; return &a; //函数调用完毕,a释放 } int main(int argc,char *argv[]) { int* p = NULL; p = fun(); *p = 100; //操作野指针指向的内存,容易报错 system("pause"); return 0; }
二、返回data区地址
int *fun() { static int a = 10; //函数调用完毕,a不释放 return &a; } int main(int argc,char *argv[]) { int* p = NULL; p = fun(); *p = 100; printf("p=%d\n", *p); system("pause"); return 0; }
三、值传递
void fun(int *tmp) { tmp = (int *)malloc(sizeof(int));//堆区分配空间,将地址传递给tmp *tmp = 100;//将堆区的地址里面的值修改为100 } int main(int argc,char *argv[]) { int* p = NULL; fun(p);//值传递,形参修改不会影响实参 printf("p=%d\n",*p);//err,操作空指针指向的内存 system("pause"); return 0; } void fun(int *tmp) { *tmp = 100; } int main(int argc,char *argv[]) { int* p = NULL; p = (int*)malloc(sizeof(int)); fun(p);//值传递 printf("p=%d\n",*p);//成功打印 system("pause"); return 0; }
四、返回堆地址
void *fun() { int* tmp = NULL; tmp = (int*)malloc(sizeof(int)); *tmp = 100; return tmp;//返回堆区地址,函数调用完毕,不释放 } int main(int argc,char *argv[]) { int* p = NULL; p=fun();//值传递 printf("p=%d\n",*p); if (p != NULL) { free(p); p = NULL; } system("pause"); return 0; }
五、二级指针
void fun(int **tmp) { *tmp = (int*)malloc(sizeof(int)); **tmp = 100; } int main(int argc,char *argv[]) { int* p = NULL; fun(&p); printf("*p=%d\n", *p); system("pause"); return 0; }