#include <stdio.h>
#include <malloc.h>
void fun1(int ** p)
{
int i = 10;
*p = &i;
}
void fun2(int * p)
{
int i = 20;
p = &i;
}
void fun3(int ** p)
{
int i = 30;
*p = &i;
}
int main(void)
{
int * a;
fun1(&a);
printf("a = %d \n", a);
printf("*a = %d \n", *a); //10
int * b;
fun2(b);
printf("b = %d \n", b); // 1
// printf("*b = %d \n", *b); //error
int * c = (int *)malloc(sizeof(int));
fun3(c);
printf("%d \n", *c); //垃圾值
return 0;
}
问题1:fun1 函数 和 fun2 函数 的区别,一个传递的是指针变量的地址,一个传递的是指针变量,为啥 fun1 函数可以得到10 ,而 fun2 函数不可以得到 20
问题2:fun1 函数的 i 变量会因为 函数fun1 的结束而被系统释放掉,进而指针指向的是一个垃圾值,为啥值还是10,(这里参照fun3 函数看)
1、传递指针变量,那个变量就只在局部方法里有用。你再fun2函数里输出一下就可以看到效果了。只有指针变量的地址才是影响全局的。
2、你没有释放,所以还是10
我按你说的方法试了一下,如果在 fun1 和 fun2 直接打印指针指向的值,都能得到 10 和 20,如果回到主函数main 继续输出的话,使用指针的地址的可以得到 10 ,只是仅仅是局部变量的话是没有效果的。你说的是没有释放,这指的是指针的地址没有释放的原因吗,如果是的话,如何释放,还有只能有系统释放(毕竟不是使用malloc动态分配的内存)
看你的代码,你的fun1也不能得到10,fun2也不能得到20啊。建议先把一级指针搞清楚,再考虑二级指针的使用。
– 。淑女范erり 4年前正常应该是这样:fun 1:
***p = i
fun2*p = i
,你的代码中修改的是指针变量本身,并没有修改指针变量指向的值。