在讨论着四种方法之前,首先要对函数有一个简单的认识,无论是在形实结合时,还是在return语句返回时,都有一个拷贝的过程。你传进来的参数是个值,自然函数在工作之前要把这个值拷贝一份供自己使用,你传进来的是个地址,函数也就会拷贝该地址供自己使用。同样return返回时,如果返回一个值,函数会将该值拷贝一份以提供给主调函数使用,返回的是一个指针(也就是地址),自然拷贝的就是一个地址,供主调函数使用。

先给出一个错误的例子:
#include <stdio.h>
#include <string.h>
char * retstring();
int main()
{
char * name2;
name2 = retstring();
printf("%s\n",name2);
return 0;
}
char * retstring()
{
char name[10];
strcpy(name,"汉青");
return name;
}
编译一下代码,会发现提示一个警告,大概意思就是说返回了一个局部变量的地址。这个程序的输出结果是不确定的,因为我们都知道,局部变量的生存期是就在块内部,这里也就是在函数retstring()的内部,在main函数中,name的内存空间已经被回收。
所以不能返回一个自动变量的字符串。。。
下面给出四种返回字符串的方法:
1、 将字符串指针作为函数参数传入,并返回该指针。
2、 使用malloc函数动态分配内存,注意在主调函数中释放。
3、 返回一个静态局部变量。
4、 使用全局变量。
下面是详细解释:
方法一:将字符串指针作为函数参数传入,并返回该指针。
典型的strcpy()函数应该就是采用的这种方法,第一个参数为指向目的字符串的指针,返回值也为这个指针。
char* strcpy(char* des,const char* source)
{
char* r=des;
assert((des != NULL) && (source != NULL));
while((*r++ = *source++)!='\0');
return des;
}
方法二:使用malloc函数动态分配,但是一定要注意在主调函数中将其释放,应为malloc动态分配的内存位于堆区,而堆区的内存是要程序员自己释放的。
一个例子如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char * retstring();
int main()
{
char * name2;
name2 = retstring();
printf("%s\n",name2);
//记住一定要用free释放,否则会造成内存泄露
free(name2);
return 0;
}
char * retstring()
{
char * name;
name = (char *)malloc(10);
strcpy(name,"张汉青");
return name;
}
方法三:返回一个静态局部变量。
一个例子如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char * retstring();
int main()
{
char * name2;
name2 = retstring();
printf("%s\n",name2);
return 0;
}
char * retstring()
{
static char name[10];
strcpy(name,"张汉青");
return name;
}
这种方法有一个问题: 由于采用了静态局部变量(位于静态区,程序结束时由系统进行释放),这就导致,如果多次调用这个函数,下一次调用会将上一次调用的结果覆盖掉。
C语言中的库函数,tmpnam()函数、getenv()函数等应该都是采用的这种方法,这也就是为什么,使用这样的函数的时候应该立即将返回结果拷贝一份的原因。
方法四: 使用全局变量。
一个例子如下:
char g_s[100];
char* fun()
{
strcpy(g_s, "abc ");
return s;
}
就写到这里啦,希望对你有所帮助。。有错误的地方还请指正,谢谢~~
# c语言函数返回字符串
# c语言返回字符串
# c语言怎么返回字符串
# C语言字符/字符串相关函数收藏大全
# C语言实现字符串操作函数的实例
# C语言字符串函数操作(strlen
# strcpy
# strcat
# strcmp)详解
# 是在
# 是个
# 四种
# 动态分配
# 这种方法
# 有一个
# 的是
# 都是
# 全局变量
# 就会
# 都有
# 就在
# 第一个
# 也就
# 对你
# 将其
# 要把
# 这也
# 这就
# 采用了
相关文章:
如何在云主机快速搭建网站站点?
如何快速生成可下载的建站源码工具?
如何通过宝塔面板实现本地网站访问?
无锡营销型网站制作公司,无锡网选车牌流程?
开源网站制作软件,开源网站什么意思?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
制作旅游网站html,怎样注册旅游网站?
如何选择最佳自助建站系统?快速指南解析优劣
如何在阿里云通过域名搭建网站?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
制作证书网站有哪些,全国城建培训中心证书查询官网?
教学网站制作软件,学习*后期制作的网站有哪些?
建站主机无法访问?如何排查域名与服务器问题
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
如何快速搭建高效WAP手机网站吸引移动用户?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
如何通过虚拟主机快速完成网站搭建?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
北京网站制作网页,网站升级改版需要多久?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
大连 网站制作,大连天途有线官网?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
高防服务器如何保障网站安全无虞?
如何安全更换建站之星模板并保留数据?
深圳网站制作的公司有哪些,dido官方网站?
如何在香港服务器上快速搭建免备案网站?
如何通过万网虚拟主机快速搭建网站?
网站制作公司排行榜,抖音怎样做个人官方网站
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
,巨量百应是干嘛的?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
已有域名和空间,如何快速搭建网站?
常州企业建站如何选择最佳模板?
建站之星安装需要哪些步骤及注意事项?
头像制作网站在线制作软件,dw网页背景图像怎么设置?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
如何快速搭建自助建站会员专属系统?
建站之星导航菜单设置与功能模块配置全攻略
如何在IIS7中新建站点?详细步骤解析
Python如何创建带属性的XML节点
5种Android数据存储方式汇总
,南京靠谱的征婚网站?
如何在建站主机中优化服务器配置?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
建站主机选虚拟主机还是云服务器更好?
*请认真填写需求信息,我们会在24小时内与您取得联系。