C语言中函数返回字符串的4中方法
C语言中函数返回字符串的4中方法
- 函数的构成部分:返回类型、函数名称、参数、函数主体
- 参数:函数调用时传入的参数称为实参,函数定义时出现的参数为形参
- 形参的作用在于接收实参传入的值,形参和函数内部的其他局部变量相同,在进入函数创建,退出函数销毁
- 值传递:实参的实际值复制给形式参数。修改形参不会改变实际参数
- 引用传递:指针传递,将实参地址复制给形参,修改形参指向的值时,实参也会发生改变
- 由此,可以得知无论是形式结合还是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;
}
- 上面这段代码会出现一个警告,这是因为返回了一个局部变量name的地址。在主函数中该局部变量name时处于销毁状态,所以name内存空间还没有被重写的话主函数中name2的值是正确,如果被其他程序重写,就会出现未知异常。
- 所以返回局部变量的字符串时很可怕的
- 函数返回字符串的方法:
- 将字符串指针作为函数参数传入,并返回该指针
- 使用malloc函数动态分配内存,在主调函数中释放
- 返回一个静态局部变量
- 使用全局变量
将字符串指针作为函数参数传入,并返回
- 典型的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;
}
- 这种方法在于采用了静态局部变量(位于静态区,程序结束时由系统释放),这会导致,下一次调用会将上次调用产生的结构进行覆盖。
- 使用这样的函数应该立即将结构拷贝一份
使用全局变量
char g_s[100];
char* fun()
{
strcpy(g_s, "abc ");
return g_s;
}
函数返回字符串问题
- 归根结底,返回字符串就是要返回一个地址,同时需要保证地址在主调函数有效。
- 直接定义char*变量,会保存在栈区,变量的作用域外会被立即销毁;malloc申请空间保存在堆区,需要手动销毁;静态区变量程序结束时销毁。
- 所以返回一个地址要么扩大他的作用域,要么控制其生命周期。
- 引用自:https://www.cnblogs.com/qingergege/p/6496683.html
C语言中函数返回字符串的4中方法的更多相关文章
- C语言中函数返回字符串的四种方法
在讨论着四种方法之前,首先要对函数有一个简单的认识,无论是在形实结合时,还是在return语句返回时,都有一个拷贝的过程.你传进来的参数是个值,自然函数在工作之前要把这个值拷贝一份供自己使用,你传进来 ...
- c语言main函数返回值、参数详解(返回值是必须的,0表示正常退出)
C语言Main函数返回值 main函数的返回值,用于说明程序的退出状态.如果返回0,则代表程序正常退出:返回其它数字的含义则由系统决定.通常,返回非零代表程序异常退出. 很多人甚至市面上的一些书籍,都 ...
- C语言strcat()函数:字符串连接(拼接)
C语言strcat()函数:字符串连接(拼接) C语言 strcat() 函数用来将两个字符串连接(拼接)起来. 头文件:string.h 语法/原型: char*strcat(char* str ...
- C函数返回字符串
#include "stdio.h" #define KEY 5; int main() { char password[50] = "123456"; enc ...
- Oracle function real_st_astext,解决ArcSDE中st_astext函数返回字符串结构异常问题
项目过程中发现在Oracle中调用ArcSDE的st_astext函数返回ST_Geometry类型字段的WKT文本有时空间类型前缀没有返回,例如一个点的经度为113.4,纬度为30.6,调用st_a ...
- SqlSever基础 Upper函数 返回字符串的大写形式
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- SqlSever基础 lower函数 返回字符串的小写形式
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- Go语言示例-函数返回多个值
Go语言中函数可以返回多个值,这和其它编程语言有很大的不同.对于有其它语言编程经验的人来说,最大的障碍不是学习这个特性,而是很难想到去使用这个特性. 简单如交换两个数值的例子: package mai ...
- C语言之函数和字符串
二.函数: 2.1.函数的执行: 1.当我们每次进入一个函数的时候,原函数的栈底进行一个备份,之后将当前函数的栈底和栈顶指针分作同一个. 2.此时我们就可以说产生了一个新栈,产生新栈之后会在新栈中申请 ...
随机推荐
- MySQL基础之练习题
题目 现有班级.学生以及成绩三张表: 备注:表名称和字段名称可以参考表格内单词设置 根据表格信息,按要求完成下面SQL语句的编写: 1.使用SQL分别创建班级表.学生表以及成绩表的表结构,表内数据可以 ...
- MySQL数据库:基本操作及增删改查语句
基本语法&&操作语句 create(创建) alter(更新) drop(删除) 一次性删除一个表中所有的数据 包括日志 truncate table 表名; 选中或者使用该数据库 说 ...
- datatable与实体类之间相互转化的几种方法
#region DataTable转换成实体类 /// <summary> /// 填充对象列表:用DataSet的第一个表填充实体类 /// </summary> /// & ...
- [PHP] pmap可以查看进程占用内存的详细情况
pmap后面跟进程id,就可以查看进程的详细情况了,例如下面php的进程 可以看到php扩展占用内存的情况,方便进行查询问题 00007fb3fa4bf000 44K r-x-- /usr/lib64 ...
- 使用scale等比例缩放图片
功能需求: 在下拉框中选择你所需要缩放的比例, 选择好了之后,图片会按照你选择的比例进行缩放 1==>如何获取select中option选中的值 在select添加事件change 和双向绑定v ...
- Educational Codeforces Round 76 (Rated for Div. 2)
传送门 A. Two Rival Students 签到. Code /* * Author: heyuhhh * Created Time: 2019/11/13 22:37:26 */ #incl ...
- [Linux]终端设备关系
1.概述 tty中基本上可以划分为console(/dev/console).虚拟终端(/dev/tty0~n)和伪终端(/dev/pts/0~n). 它们之间存在一定的关系. 为了说明这段关系,先要 ...
- LeetCode 5127. 删除被覆盖区间 Remove Covered Intervals
地址 https://www.acwing.com/solution/LeetCode/content/7021/ 目描述给你一个区间列表,请你删除列表中被其他区间所覆盖的区间. 只有当 c < ...
- 第02组 Beta版本演示
目录 1. 博客链接及组员信息(2分) 2. 贡献比例(3分) 3. GitHub 项目链接(1分) 4. 博客汇总(2分) 5. 燃尽图(3分) 6. 原计划.达成情况及原因分析(6分) 7. Be ...
- java war包 路径--解决war包中文件路径问题
https://blog.csdn.net/u013409283/article/details/51480948 转自:http://free-chenwei.iteye.com/blog/1507 ...