C语言如何返回字符串
答案:7 悬赏:0
解决时间 2021-02-27 19:17
- 提问者网友:战皆罪
- 2021-02-27 12:27
C语言如何返回字符串
最佳答案
- 二级知识专家网友:渡鹤影
- 2021-02-27 13:25
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、例如:
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);//释放内存
全部回答
- 1楼网友:山君与见山
- 2021-02-27 16:30
new出来的是在堆中,没有用new是在栈中,离开了 fanhui()就释放了
- 2楼网友:玩世
- 2021-02-27 16:16
new 的作用是申请内存,函数结束后这段内存不会被释放掉。而如果不用new,在函数结束后内存就会被释放掉,即使有首地址,内存被释放掉了,还是无法访问。
- 3楼网友:十年萤火照君眠
- 2021-02-27 15:58
使用new时,str在堆内分配,在没有调用delete前,都会被保留下来,所以输入数据被保存下来。
如果使用
char* fanhui()
{
char aStr[50];
cin>>aStr;
return aStr;
}
由于aStr在栈内分配,当fanhui函数返回后,栈空间被销毁,发回的aStr是无效的。
追问:那我该如何,在哪里将它释放呢?
如果使用
char* fanhui()
{
char aStr[50];
cin>>aStr;
return aStr;
}
由于aStr在栈内分配,当fanhui函数返回后,栈空间被销毁,发回的aStr是无效的。
追问:那我该如何,在哪里将它释放呢?
- 4楼网友:由着我着迷
- 2021-02-27 15:02
返回了栈内存,函数中分配的栈内存在函数运行结束后,就释放了。所以就会访问出错。
- 5楼网友:上分大魔王
- 2021-02-27 14:45
返回一个指向该字符串的指针,
(要注意保护这个指针指向的字符串的空间。
(要注意说明该指针的所有权。
(要注意保护这个指针指向的字符串的空间。
(要注意说明该指针的所有权。
- 6楼网友:愁杀梦里人
- 2021-02-27 14:24
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; 就可以了、、
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; 就可以了、、
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯