关于指针在函数中赋值的问题

1、最简单的有swap(int a,int b)函数,估计这个大家都是知道的。其实这也是下面要讨论的问题的症结所在,那就是函数的参数和传进的变量之间的关系,我们可以通过程序输出地址发现,参数和传入的变量并不是公用一个地址,也就是参数只是对变量的一个简单的copy。

2、看下面一段代码:

typedef struct node{
   int a;
   struct node * next;
}Node;

void test(Node *B)
{
   B = (Node *)malloc(sizeof(Node));
   B->a = 1;
   B->next = NULL;
}

void main()
{
	Node *B;
	test(B);
	printf("%3d\n",B->a);
}

在这里我们需要知道的一点内存分配的知识:

1、参数、局部变量分配在栈区中。编译器自动回收
2、malloc申请的内存分配在堆上,由程序结束OS回收

3、全局(静态区),全局变量和静态变量,由程序结束OS回收

如果大家不知道这个正确结果的情况下,可能会这样认为,因为malloc申请的空间是在堆上面的,所以在函数释放的时候,空间还是存在的,那么主函数的指针B的指向的空间还是存在的。

    但是大家通过执行就会知道这段代码是会报错的,原因我们最开始已经说了,对的,那就是参数的指针B只是对主函数指针B的浅层Copy,这相当于是两个指针,在传递的情况下是指向的同一个空间。但是随着在Test函数中指针重新申请空间,那么主函数的指针空间还是指向原来的地方(并没有初始化),而Test函数中的函数是指向了新申请的空间。所以这就导致了错误。

    那么正确的解决方法就是,Test函数中的参数指针比主函数的指针高一级,也就是传入的是地址,那么就可以直接对那个地址空间操作。


猜你喜欢

转载自blog.csdn.net/c_living/article/details/81003449