首页 新闻 会员 周边

c语言指针问题

0
悬赏园豆:15 [已解决问题] 解决于 2020-04-21 19:27
#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 函数看)

简活的主页 简活 | 初学一级 | 园豆:162
提问于:2020-04-19 23:13

看你的代码,你的fun1也不能得到10,fun2也不能得到20啊。建议先把一级指针搞清楚,再考虑二级指针的使用。
正常应该是这样:fun 1: ***p = i fun2 *p = i,你的代码中修改的是指针变量本身,并没有修改指针变量指向的值。

。淑女范erり 4年前
< >
分享
最佳答案
0

1、传递指针变量,那个变量就只在局部方法里有用。你再fun2函数里输出一下就可以看到效果了。只有指针变量的地址才是影响全局的。

2、你没有释放,所以还是10

收获园豆:15
西红柿里没有番茄 | 小虾三级 |园豆:645 | 2020-04-20 09:32

我按你说的方法试了一下,如果在 fun1 和 fun2 直接打印指针指向的值,都能得到 10 和 20,如果回到主函数main 继续输出的话,使用指针的地址的可以得到 10 ,只是仅仅是局部变量的话是没有效果的。你说的是没有释放,这指的是指针的地址没有释放的原因吗,如果是的话,如何释放,还有只能有系统释放(毕竟不是使用malloc动态分配的内存)

简活 | 园豆:162 (初学一级) | 2020-04-20 22:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册