C语言函数返回字符串
来源:互联网 发布:软件市场代理 编辑:程序博客网 时间:2024/06/06 01:55
先给出一个错误的例子:
#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 g_s; }
阅读全文
0 0
- c语言函数返回字符串
- C语言函数返回字符串
- LINUX C语言中返回字符串函数
- C语言中实现函数返回字符串
- C语言 —— 函数返回字符串常量
- C语言strlen()函数:返回字符串的长度
- C语言strerror()函数:返回错误原因的描述字符串
- C语言strlen()函数:返回字符串的长度
- C语言中函数返回字符串的四种方法
- C语言中函数返回字符串的四种方法
- C语言中函数返回字符串的四种方法
- C语言中函数返回字符串的四种方法
- C语言中函数返回字符串的四种方法
- C语言strlen()函数:返回字符串的实际长度
- C语言中函数返回字符串的四种方法
- C语言字符串的返回
- C 通过函数返回字符串
- C语言字符串函数
- 关于unity自带的雾
- 深度学习之数值计算(二)poor conditioning
- php 函数及内部函数1
- CSS笔记——border
- 【机器学习】Andrew Ng——前言
- C语言函数返回字符串
- 【ZJOI2005】沼泽鳄鱼 题解报告
- poi导出execl
- nextTick, setTimeout 以及 setImmediate 三者的执行顺序
- Git
- Windows 下 Tomcat 部署 maven项目 POST 返回中文乱码问题
- Win10电脑时间无法同步解决方法
- 遍历Map的四种方法
- 阿里云安全合作伙伴计划 新一轮招募开始