linux 函数返回值,C语言的函数返回值

一:背景

谈到C语言的函数返回值,可能会感觉很亲切,不就是一个函数返回值嘛,当初学C语言的时候早就学过了很easy嘛,我曾经也是这么想的。后来要上研究生了,研究生阶段搞得就是C,所以又重新开始学习C,学习C的过程中遇到了很多问题,在此博客中一一记录。实际过程中遇到的第一个问题自然就是函数返回值了。如果有人问你在一个函数中声明一个字符串数组,最后再return这个数组。这可以实现嘛?如果是问我我可能会毫不犹豫的说OK。那事实呢?由此本文诞生了......

将C语言梳理一下,分布在以下10个章节中:

二:问题

先看几个实际的例子:

#include

#include

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提示。对于这类问题,我们要明确函数返回的是什么,如果是值的话没有关系,如果是地址的话,要看是局部的还是全局的还是堆的。如果是局部的就不能返回。如果是全局的就没有关系了,如果是堆的那么请记住要记得释放掉。

三:方法

那么对于一个函数来说,我该怎么返回一个字符串呢。

方法如下:

方法一:返回一个指向字符串指针的常量。

char *func{return "only works for simple strings"}

这是最简单的解决方案,但是如果你需要对字符串处理那就无能为力了。

方法二:使用全局数组

char *func(){

my_global_array[i] = 'a';

return my_global_array;

}

这种方法也是很简单易用的,但是大量创建这样的全局字符串数组增加了程序的耦合性。并且任何人都可以修改这个全局数组,而且下一次函数调用也会覆盖该数组的内容。

方法三:使用静态数组

char * func(){

static char buffer[20];

return buffer;

}

这种方法比使用全局数组要好,可以防止任何人修改这个数组的内容,只有拥有该数组的指针函数才能修改这个静态数组。但是函数下一次调用将覆盖这个数组的内容。

方法四:显示分配一些内存

char *func()

{

char *s = malloc(120);

return s;

}

http://www.linuxidc.com/Linux/2014-07/104737.htm 参见这篇博文mlloc分配的内存是放在堆段的,只有编程者自己手动通过free来释放内存的。所以不会因为函数执行完毕就释放其内存。

但是这种方法要求编程者谨记要自己手动释放内存,这种写法不太好,因为malloc和free不在同一个代码块中很容易忘记使用free.

方法五:也许是最好的解决方案

void func(char *result,int size)

{

strcpy(result,"test",size);

}

buffer = malloc(size);

func(buffer,size);

free(buffer);

这种方案只要malloc和free的使用在一个代码块中那么内存管理就显得轻松了。

四:总结

C语言真的很简单,简单到什么都要自己做。

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值