C函数形参传递

在上大学的时候,C语言的教材上有这么一个经典的案例–编写函数来交换两个数的值。这个案例针对的是C语言函数参数的传递过程,先来复习一下这个过程。
在这里插入图片描述
在这里插入图片描述

上面的函数是第一个版本的交换两个数的代码,看上去没有问题,然后执行的结果却和我们预期的不一样
从打印结果来看,在my_swap函数里确实是把a和b的值交换了,但是m和n的值还是原来的值,按道理来说m,n
和a,b是对应的,所以,从结果来看,my_swap函数是完成了这个功能,只不过它在返回的时候发生了错误的情况。
1、要解释这个现象就要说一下C语言的函数参数问题,在定义函数的时候使用"void my_swap(int a,int b)",可以看到,
my_swap函数有两个参数a和b,这两个参数叫做函数的形参,实际调用的时候传入的参数是m和n,这两个参数叫做函数的实参,
函数的形参在定义的时候是没有内存空间的,也就是这个时候这两个变量还没有空间,在函数被调用的时候才为函数的形参分配空间。
2、在main函数调用该函数的时候,对应的传入了m和n,这时候隐含的操作是"a = m, b = n",那么a就等于10,b就等于20
在交换之后这两个变量的值也确实交换了,只不过a,b的空间和m,n的空间是独立的,函数的形参空间在该函数被调用完之后
立即被释放掉,所以,它们的变化不会引起m,n的变化,这也就是函数形参和实参的区别。

对上面的程序进行改进,我们来看下一个版本
在这里插入图片描述
在这里插入图片描述

从程序的执行结果看出,这一次的结果是我们想要的,那么这一次又是为什么呢?
1、这一次的函数在定义的时候有了一点区别,形参是int型的指针,函数里也是使用int型的指针就行操作的
在main函数调用该函数时也传递的时变量的地址
2、通过第一个例子的分析可以知道,在调用该函数时有隐含的操作,同样的我们把它写出来
"a = &m,b = &n",把m的地址传递给了指针变量a,把n的地址传递给了指针变量b,
我们知道,函数的形参a,b会被分配独立的地址空间,此时这两个变量的值分别是m和n的地址
那么在交换操作时,使用"*a *b"进行操作,也就是对a和b指向的地址处的值进行操作,那就是针对
m和n地址处的值进行操作,也就是对m和n进行交换了,所以,最后m和n的值也发生了变化,虽然函数的形参
a和b最后会被释放掉,但是也不会影响最后的效果,因为它们间接的对函数的形参进行了改变。

以上为前提,最近我遇到一个问题,定义一个函数"void my_malloc(char *p) ",在函数里为p分配空间,有了上面的基础
我想都没想就写出了函数的定义
在这里插入图片描述
在这里插入图片描述

函数看起来是没有问题的,可是一执行就出现了问题,在my_malloc函数里是正确被赋值了的,在main函数里却是null,
这么一看是不是和上面那个问题大同小异,可是当时我就没反应过来,我心想这个问题简单,我也是学过C语言的,
函数的带出形参传递地址就没有问题,然后,就懵了。。。。。。
那么,来对上面这个程序进行分析,在main函数中声明了一个char *型的指针变量,指针变量的值应该是一个地址,
现在没有对这个变量进行赋值,所以它的值是随机的,那么在调用的时候执行了隐含的操作"p = str",把str的值赋给了指针变量p,
那么p的值也就是随机的一个地址,然后申请了一块128字节的空间,把空间的首地址返回给了变量p,然后执行下面的操作
但是,在函数调用完成之后,变量p被释放掉了,且不说是单单变量被释放掉了,还是连着p所指向的空间一起释放掉了(我当时多考虑的
地方就在这里),在main函数里都是不能拿到这一块空间的地址,所以main函数的打印是错误的,而且str = null,所以,连空间一起释放掉了

下面进行改进
在这里插入图片描述
在这里插入图片描述

该怎么改进呢?传递变量的地址不就好了,和我们上面交换变量的值一样
从程序的运行结果来看,确实是没有问题,那么,我犯的错误在哪里呢?
虽然my_malloc函数的形参是一个指针型变量,但说到底它还是一个变量,要在函数里通过形参去改变实参的值就要传递变量的地址进来,
在这里也就是传递指针变量的地址,指针的指针不就是二级指针了嘛,而我当时想传递的是一个指针变量,它的值不就是地址嘛,所以引发了问题
这个问题本不是个大问题,由于自己的粗心才引起的,在这里简单记录一下,引以为戒。
发布了33 篇原创文章 · 获赞 2 · 访问量 1017

猜你喜欢

转载自blog.csdn.net/weixin_41791581/article/details/103497967