C语言指针做函数返回值

C语言指针做函数返回值教程

C 语言 中,函数返回值 除了可以是普通的 数据类型,还可以是 指针 类型。我们将函数的返回值定义为指针类型,用来返回一个 变量 的地址,但我们不可以返回局部变量的地址。

用指针作为函数返回值时需要注意的一点是,函数运行结束后会销毁在它内部定义的所有局部数据,包括局部变量、局部数组和形式参数,函数返回的指针请尽量不要指向这些数据。

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; }

程序运行后,控制台输出如下图所示:

29_C语言指针做函数返回值.png

我们首先,定义了一个函数 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; }

程序运行后,控制台输出如下图所示:

30_C语言函数返回局部变量地址.png

我们在函数 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; }

程序运行后,控制台输出如下图所示:

31_C语言函数返回局部变量地址.png

这次,我们在打印之前,增加了一个 printf 的函数调用,此时,我们再次运行该程序,我们可以看到,这次输出了 0,发生了未知的错误,因此,我们在程序中,坚决不要返回局部变量的地址。

C语言指针做函数返回值总结

在 C 语言中,函数的返回值除了可以是普通的数据类型,还可以是指针类型。我们将函数的返回值定义为指针类型,用来返回一个变量的地址,但我们不可以返回局部变量的地址。