C语言如何返回字符串

#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就不行,有什么意义吗,求解。

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; 就可以了、、

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-09-24

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);//释放内存

第2个回答  2011-04-26
使用new时,str在堆内分配,在没有调用delete前,都会被保留下来,所以输入数据被保存下来。
如果使用
char* fanhui()
{
char aStr[50];
cin>>aStr;
return aStr;
}
由于aStr在栈内分配,当fanhui函数返回后,栈空间被销毁,发回的aStr是无效的。追问

那我该如何,在哪里将它释放呢?

第3个回答  2011-04-26
new出来的是在堆中,没有用new是在栈中,离开了 fanhui()就释放了
第4个回答  2011-04-26
new 的作用是申请内存,函数结束后这段内存不会被释放掉。而如果不用new,在函数结束后内存就会被释放掉,即使有首地址,内存被释放掉了,还是无法访问。
相似回答