C语⾔中函数返回字符串的⽅法汇总
在讨论着四种⽅法之前,⾸先要对函数有⼀个简单的认识,⽆论是在形实结合时,还是在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、使⽤全局变量。
下⾯是详细解释:
printf函数返回值⽅法⼀:将字符串指针作为函数参数传⼊,并返回该指针。
典型的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;
}
就写到这⾥啦,希望对你有所帮助。。有错误的地⽅还请指正,谢谢~~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论