一:背景
谈到C语言的函数返回值,可能会感觉很亲切,不就是一个函数返回值嘛,当初学C语言的时候早就学过了很easy嘛,我曾经也是这么想的。后来要上研究生了,研究生阶段搞得就是C,所以又重新开始学习C,学习C的过程中遇到了很多问题,在此博客中一一记录。实际过程中遇到的第一个问题自然就是函数返回值了。如果有人问你在一个函数中声明一个字符串数组,最后再return这个数组。这可以实现嘛?如果是问我我可能会毫不犹豫的说OK。那事实呢?由此本文诞生了......
二:问题
先看几个实际的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#include<stdio.h> #include<stdlib.h> char *return_arry();
int main ( int argc, char *argv[] )
{ printf ( "%s\n" ,return_arry());
printf ( "%d\n" ,return_var());
return EXIT_SUCCESS;
} /* ---------- end of function main ---------- */ char * return_arry ( )
{ char str[]= "zhangyifei" ;
return str;
} /* ----- end of function return_arry ----- */ int return_var ( )
{ int a = 5;
return a;
} /* ----- end of function return_var ----- */ linux 下gcc编译报错如下: return .c: In function ‘return_arry’:
return .c:35:2: warning: function returns address of local variable [-Wreturn-local-addr]
return str;
^
|
可见函数中是无法返回一个局部变量数组的。那为何return_var中没有报错呢。
其原因在于return a 其本质是返回了a的值,而return str则是返回了这个数组的首地址。然后str是一个局部变量,函数结束后这个地址就会被释放掉。所以gcc提示。对于这类问题,我们要明确函数返回的是什么,如果是值的话没有关系,如果是地址的话,要看是局部的还是全局的还是堆的。如果是局部的就不能返回。如果是全局的就没有关系了,如果是堆的那么请记住要记得释放掉。
三:方法
那么对于一个函数来说,我该怎么返回一个字符串呢。
方法如下:
方法一:返回一个指向字符串指针的常量。
1
|
char *func{ return "only works for simple strings" }
|
http://forlinux.blog.51cto.com/8001278/1440352 参见这篇博文,常量是存放再代码段的,整个程序的执行周期都在不会因为子函数的结束而释放。
这是最简单的解决方案,但是如果你需要对字符串处理那就无能为力了。
方法二:使用全局数组
1
2
3
4
|
char *func(){
my_global_array[i] = 'a' ;
return my_global_array;
} |
这种方法也是很简单易用的,但是大量创建这样的全局字符串数组增加了程序的耦合性。并且任何人都可以修改这个全局数组,而且下一次函数调用也会覆盖该数组的内容。
方法三:使用静态数组
1
2
3
4
|
char * func(){
static char buffer[20];
return buffer;
} |
http://forlinux.blog.51cto.com/8001278/1440352 参见这篇博文,静态变量是存放在数据段的也是整个程序执行周期都不释放的。
这种方法比使用全局数组要好,可以防止任何人修改这个数组的内容,只有拥有该数组的指针函数才能修改这个静态数组。但是函数下一次调用将覆盖这个数组的内容。
方法四:显示分配一些内存
1
2
3
4
5
|
char *func()
{ char *s = malloc (120);
return s;
} |
http://forlinux.blog.51cto.com/8001278/1440352 参见这篇博文mlloc分配的内存是放在堆段的,只有编程者自己手动通过free来释放内存的。所以不会因为函数执行完毕就释放其内存。
但是这种方法要求编程者谨记要自己手动释放内存,这种写法不太好,因为malloc和free不在同一个代码块中很容易忘记使用free.
方法五:也许是最好的解决方案
1
2
3
4
5
6
7
8
|
void func( char *result, int size)
{ strcpy (result, "test" ,size);
} buffer = malloc (size);
func(buffer,size); free (buffer);
这种方案只要 malloc 和 free 的使用在一个代码块中那么内存管理就显得轻松了。
|
四:总结
C语言真的很简单,简单到什么都要自己做。
本文出自 “专注linux” 博客,请务必保留此出处http://forlinux.blog.51cto.com/8001278/1530404
相关推荐
主要介绍了详解C语言函数返回值解析的相关资料,需要的朋友可以参考下
C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数。下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: #include #include char *strlong(char *str1, char *str2){...
总结了const的各种使用方法,及其作用效果,谢谢观看
296-用P0 、P1口显示整型函数返回值(51单片机C语言实例Proteus仿真和代码)296-用P0 、P1口显示整型函数返回值(51单片机C语言实例Proteus仿真和代码)296-用P0 、P1口显示整型函数返回值(51单片机C语言实例Proteus仿真...
详细介绍了函数返回值的含义,对于c初学者有一定的帮助!
嵌入式C语言培训-C编程基础-函数返回值,需要的朋友可以下载一下。
主要介绍了C语言中数组作为函数的参数以及返回值的使用简单入门,这里以一维数组作为基本条件进行例子讲解,需要的朋友可以参考下
C语言29:用P0 、P1口显示整型函数返回值
C语言函数说明与返回值.pdf
本文章是关于枚举和函数返回值使用。
296-用P0 、P1口显示整型函数返回值单片机C语言源码.zip项目程序C语言源码下载296-用P0 、P1口显示整型函数返回值单片机C语言源码.zip项目程序C语言源码下载 1.合个人学习技术做项目参考 2.适合学生做毕业设计参考 ...
9.1 1分钟彻底理解指针的概念 9.2 大话C语言指针变量 9.3 C语言指针变量的运算 9.4 数组指针(指向数组的指针) 9.5 字符串指针(指向字符串的
单片机C语言实例-用P0 、P1口显示整型函数返回值.zip
单片机C语言源码学习参考-用P0 、P1口显示整型函数返回值.zip
单片机C语言实例29:用P0 、P1口显示整型函数返回值.txt
C):这很容易,fun3 是函数名,p1,p2 是参数,其类型为char *型,函数的返回值为char *类型。 B):也很简单,与C)表达式相比,唯一不同的就是函数的返回值类型为char**,是个二级指针。 A):fun1 是函数名吗?...
函数原型说明 功能 返回值 说明 int abs( int x) 求整数x的绝对值 计算结果 double fabs(double x) 求双精度实数x的绝对值 计算结果 double acos(double x) 计算cos-1(x)的值 ...
C函数库手册,按照函数功能来分类 分类函数,所在函数库为ctype.h int isalpha(int ch) 若ch 是字母('A'-'Z','a'-'z')返回非0 值,否则返回0 int isalnum(int ch) 若ch 是字母('A'-'Z','a'-'z')或数字('0'-'9')返回非...