C语言如何返回字符串

#include<iostream>usingnamespacestd;char*fanhui(){char*str=newchar[50];cin>>str;retur... #include <iostream>
using namespace std;
char* fanhui()
{
char* str=new char[50];
cin>>str;
return str;
}
void main()
{
char *str;
str=fanhui();
cout<<str<<endl;
}
为什么这里使用char* str=new char[50];就行,而不用 new就不行,有什么意义吗,求解。
展开
 我来答
俎静皖9f
2011-04-26 · TA获得超过722个赞
知道小有建树答主
回答量:68
采纳率:100%
帮助的人:104万
展开全部
new 是动态分配(在堆上分配),你向系统要了 50 B 的内存,如
char* str=new char[50]; // 50 * 1B
堆上分配就是这情况,你不释放(delete一下),它就认为你在用着;不会再给别人用
如果给你的你不用了,或是你把它给忘记了,那就算是内存泄露了、

当然,你程序退出的时候,系统会替你回收、不过这样的习惯不好,你想,如果你写了死循环(操作系统、服务器程序等)、那里面不断滴在内存泄露,你就危险了、后来发现,不知不觉,内存怎么就不够用了,明明自己用的不多啊、、

修改一下:
char* fanhui()
{
static char str[100]; // 局部变量,静态局部变量,它在第一次调用的时候分配,
cin >> str; // 函数返回了,str的空间还是存在的,也就是不会重复申请、
return str; // 而且,函数外面通过,指针也是可以访问他们的、、
}


char* fanhui()
{
char str[100]; // 局部变量,默认动态局部变量,它在每一次调用的时候分配,
cin >> str; // 函数返回了,str的空间也就不存在了,他是在,栈,上分配的、
return str; // 函数外面通过,指针想访问?、非法!!!人都不在了,你喊他干嘛啊??
}
追问
如果我要通过上面的这段程序自己去释放,那么,释放的代码应该怎样写呢?
追答
在主函数最后一条语句之后,return 0;之前添加
delete [] str; // 对于数组就是delete[] str; 这种形式,
// 对于单个变量delete pi; 就可以了、、
tattackor
2015-09-24 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:890万
展开全部

1、C语言中,字符串不是一种基本类型,其本质是字符数组,因此直接返回字符串是不行的。因为C语言不允许例如 char[10] fun(){}这样的函数定义方式。但是可以返回字符指针。返回一个动态分配的内存地址。

2、例如:

char * c;
char * getInput(int length)//length 为要输入字符串的最大长度
{
     char *tmp = (char *)malloc(length); //动态分配字符串空间
      scanf("%s", tmp);//获取输入
      *(str + length)=0;//保证会有一个正确的结尾
     return tmp; //返回分配空间的首地址
}
c = getInput( 100);
//当不再使用时需要调用
free(c);//释放内存
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
java_zhang
2011-04-26
知道答主
回答量:3
采纳率:0%
帮助的人:0
展开全部
使用new时,str在堆内分配,在没有调用delete前,都会被保留下来,所以输入数据被保存下来。
如果使用
char* fanhui()
{
char aStr[50];
cin>>aStr;
return aStr;
}
由于aStr在栈内分配,当fanhui函数返回后,栈空间被销毁,发回的aStr是无效的。
追问
那我该如何,在哪里将它释放呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
seamaswong
2011-04-26 · TA获得超过1122个赞
知道小有建树答主
回答量:483
采纳率:0%
帮助的人:379万
展开全部
new出来的是在堆中,没有用new是在栈中,离开了 fanhui()就释放了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
天上的一条龙
2011-04-26 · TA获得超过476个赞
知道小有建树答主
回答量:221
采纳率:0%
帮助的人:205万
展开全部
new 的作用是申请内存,函数结束后这段内存不会被释放掉。而如果不用new,在函数结束后内存就会被释放掉,即使有首地址,内存被释放掉了,还是无法访问。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式