在 C 语言 中,函数 的 返回值 除了可以是普通的 数据类型,还可以是 指针 类型。我们将函数的返回值定义为指针类型,用来返回一个 变量 的地址,但我们不可以返回局部变量的地址。
用指针作为函数返回值时需要注意的一点是,函数运行结束后会销毁在它内部定义的所有局部数据,包括局部变量、局部数组和形式参数,函数返回的指针请尽量不要指向这些数据。
C 语言没有任何机制来保证这些数据会一直有效,它们在后续使用过程中可能会引发运行时错误。
type *funcName()
{
return val;
}
我们定义了一个函数 funcName,其返回值为 type 类型的指针。
使用指针做函数的返回值
#include <stdio.h>
#include <string.h>
char *maxStr(char *str1, char *str2)
{
if (strlen(str1) >= strlen(str2))
{
return str1;
}
else
{
return str2;
}
}
int main()
{
printf("嗨客网(www.haicoder.net)\n\n");
char* str1 = "Hello,HaiCoder";
char* str2 = "Hello,World";
char *maxStrRet = maxStr(str1, str2);
printf("MaxStrRet = %s\n", maxStrRet);
return 0;
}
程序运行后,控制台输出如下图所示:
我们首先,定义了一个函数 maxStr,该函数接受两个指针类型的 参数 ,同时也返回一个指针类型的返回值。在函数内部,我们使用 strlen 函数计算了两个 字符串 的长度,返回了较长的字符串。
最后,在 main 函数 我们调用了该函数,并传入了两个字符串参数,我们可以看到,maxStr 函数返回了长度较长的那个字符串。
返回局部变量的地址,会发生未知的错误
#include <stdio.h>
int *arrSize()
{
int size = 100;
return &size;
}
int main()
{
printf("嗨客网(www.haicoder.net)\n\n");
int *pSize = arrSize();
printf("pSize = %d\n", *pSize);
return 0;
}
程序运行后,控制台输出如下图所示:
我们在函数 arrSize 里面,返回了局部变量 size 的地址,这次运行程序,貌似没有问题,现在,我们修改程序如下:
#include <stdio.h>
int *arrSize()
{
int size = 100;
return &size;
}
int main()
{
printf("嗨客网(www.haicoder.net)\n\n");
int *pSize = arrSize();
printf("return local address\n");
printf("pSize = %d\n", *pSize);
return 0;
}
程序运行后,控制台输出如下图所示:
这次,我们在打印之前,增加了一个 printf 的函数调用,此时,我们再次运行该程序,我们可以看到,这次输出了 0,发生了未知的错误,因此,我们在程序中,坚决不要返回局部变量的地址。
在 C 语言中,函数的返回值除了可以是普通的数据类型,还可以是指针类型。我们将函数的返回值定义为指针类型,用来返回一个变量的地址,但我们不可以返回局部变量的地址。