首页 理论教育C语言基础教程:返回指针值的函数

C语言基础教程:返回指针值的函数

【摘要】:系统标准库中有许多返回指针值的函数,如字符串处理、存储分配等标准库函数。返回指针值的函数的调用与普通函数的参数传递相同,所不同的是需要定义一个与其返回值数据类型相同的指针变量来接收返回值。求,要求使用静态局部变量和返回指针的函数方式进行处理。返回指针值函数设计最重要的一点是其返回值(指针),总体原则是:返回的指针所对应的内存空间不能因该指针函数的返回而被释放掉。

系统标准库中有许多返回指针值的函数,如字符串处理、存储分配等标准库函数。返回指针值函数定义的一般形式:

数据类型符 *函数名(形式参数表及定义)

上式中,数据类型符用指针类型(数据类型符*)表示,标识指针类型的星号(*)可以靠近数据类型名一侧,也可以靠近函数名一侧,习惯上书写为靠近函数名。例如,设有函数定义的头部为:

float*fun(int m)

那么,fun是函数名,返回值类型是float*(即单精度实型地址类型),该返回值类型表示函数调用后会返回一个指向实型数据指针值。

返回指针值的函数的调用与普通函数的参数传递相同,所不同的是需要定义一个与其返回值数据类型相同的指针变量来接收返回值。

上面程序中,函数fac是一个返回整型指针值的函数,每次执行后返回函数中定义的静态变量p的地址给主调函数中的指针变量pi,然后在主调函数中使用指针变量的指针运算形式*pi取出指针变量所指向数据对象(fac函数中的p)值进行累加。程序一次运行结果如下:

Input n:6//输入数据

Sum=873

定义和使用返回指针值函数必须要注意的是:那些在函数中定义的自动变量的生存期仅与函数调用时间相当,当函数调用结束返回时会自动被系统撤销,所以返回指针值的函数中,不能返回这些自动变量的地址。能够在被调函数中被返回地址值的变量只能是全局变量或者静态局部变量。下面通过一个错误的返回指针值函数示例进行分析。(www.chuimin.cn)

【例8.2】 统计[1,1234]中有多少个数能够被3整除。

例8.2程序的函数fun中,将局部变量i的地址值作为函数的返回值,但局部变量i的生存期仅与函数fun执行时间相当,当函数fun调用结束后变量i已经被系统自动撤销(i的存储空间已经被收回),将变量i的地址值返回给main函数中的count就存在一个潜在错误,程序运行时可能出现不可预料的错误。这种错误在较老的C编译器中可能检查不出来,但使用较新的编译系统能够检查出这种错误,例如,VC6编译系统的提示信息是:warning C4172:returning address of local variable or temporary(错误C4172:返回局部变量或局部数据的地址)。函数fun的正确定义形式如下,请读者对照分析:

设函数的原型为:int*getdata(int num);,函数的功能是获取一个存放到连续存储区域的数据序列,序列中数据的个数由参数num指定,函数最多能够获取由100个整数组成的序列,当要求的数量(由num指定)超过100个时,函数拒绝进行数据采集,返回空值(NULL)。下面展示的是错误设计方法和正确设计方法的比较,请读者仔细分析。

通过上面函数对照可以看出,设计正确与否主要在于函数内使用的数组是否静态数组。返回指针值函数设计最重要的一点是其返回值(指针),总体原则是:返回的指针所对应的内存空间不能因该指针函数的返回而被释放掉。返回的指针通常有以下几种:

①函数中动态分配的内存(通过malloc等实现)的首地址;

②函数中的静态(static)变量或全局变量所对应的存储单元的首地址;

③通过指针形参所获得的实参的有效地址。