问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言中以字符串为返回值的函数的问题,困扰我好几天了

发布网友 发布时间:2022-04-23 06:45

我来回答

4个回答

热心网友 时间:2022-06-16 22:18

野指针的含义:超出生命周期的指针,包括函数内局部数据的指针(static修饰数据除外,它不在栈上)和已经被释放了的动态分配内存区。
char *Getstr(void)

{
char s[80];
scanf("%s",s);
printf("s = %p\n",s);
return s;
}
这个函数,是将栈内局部变量的地址返回给调用者,调用者拿到的指针属于典型的超出生命周期的指针,对它的使用会不会引起错误,依赖于进一步的操作,本身行为就是不可预期的。
可以认为:使用strcpy和printf并没有破坏这个内存区域,即没有对这部分内存做修改,因此运行可以得到你期待的结果。但puts的运行修改了这部分内存区,导致你看到的都是乱码。

避免野指针带来的不确定性:
你可以使用
char *Getstr(void)
{
static char s[80];
scanf("%s",s);
printf("s = %p\n",s);
return s;
}
用这个函数,你的所有逻辑都不变。
或者
char *Getstr(void)
{
char *s = malloc(80);
scanf("%s",s);
printf("s = %p\n",s);
return s;
}
要记得在这个调用后得到的ptr,一定要用free(ptr)。

热心网友 时间:2022-06-16 22:18

一、不要使用局部变量作为返回值来使用!因为,子函数一结束,局部变量就被释放。
当有其它程序用到该内存数据时,数据就会发生变化,
而若没有人使用,则数据不会发生变化。
二、一定要使,则将局部变量定义成静态变量,相当于定义一个全局变量:
char *Getstr(void)
{
static char s[80]; //加上static
scanf("%s",s);
printf("s = %p\n",s);
return s;
}

热心网友 时间:2022-06-16 22:19

子函数结束之后所占的内存被释放掉意思是“这片内存空间从释放掉之后就可以再次被其他程序使用”,但是这片空间里的内容有没有改变就不好说了,程序输出正确的结果只能说明在你函数返回到调用fputs这段时间里这片内存没有被重新赋其他的值。虽然结果是正确的,语法上也没有错误,但是这种写法是不对的!只要是被释放掉的内存空间绝对不可以再次引用!

热心网友 时间:2022-06-16 22:19

#include <stdio.h>
#include <string.h>
char *Getstr(void);
int main()
{
char str[80];
printf("Input a string");
strcpy(str,Getstr());//没有直接用Getstr()的返回值,而是把Getstr()的内容复制给str
puts(str);
return 0;
}
char s[80];//声明为全局变量
char *Getstr(void)
{
scanf("%s",s);
printf("s = %p\n",s);
return s;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机垃圾清理使用哪个软件最好? 适合新手用的手机清理软件 苹果手机怎么把号码黑名单里? VUE视频相机使用教程 教你简单几步拍出大片 如何使用佳能相机录像 相机录像具体操作教程分享 羊头捣蒜做法图解 服刑期间领取养老金是否构成犯罪 狗狗胰腺炎最怕的三种蔬菜是什么 怎么喂食 银行卡给专业的贷款公司做流水有风险吗? 电话号可直接贷款吗,他知道我的实名电话,还用paos机刷了我的银行卡一... VB中string()是什么意思 qq怎么申请注册 Unicode字符是什么? sql中,字符串的字符串 怎么用注册qq 名词解释:字符串比较的规则,外部变量 java中String[][] 是什么东西?string[]又是什么东西? vb中字符串运算符都有什么啊? 给女儿取名字,姝洁和思诺哪个更好听,本人姓李 张娅姝个人资料 身高 清平乐:张妼晗做了什么,让赵祯直呼皇后只能是丹姝? 三星手机微拍 清平乐:赵祯对秋和问东问西,丹姝看出猫腻,为何梳头夫人却不是秋和? 年过完了,初七八可以向别人借钱吗?向自己的亲姐姝借,遇到些困难,听说正月没出去,向别人借钱不太好,_百度问一问 拍视频什么软件可以改身后背景墙颜色,同时录制 那些手机支持微拍(即距拍)啊?谢谢 求推荐微拍好的手机 怎么举报微信好友才有用? 微信被删除了还能举报他吗? 微信可以举报好友么 C语言问题:将字符串a复制到字符串b中 西部数据蓝盘和紫盘,家用玩游戏有区别吗? 怎么通过qq注册新 微信6.0怎么用qq注册 椭圆机运动有哪些好处 椭圆机做有氧的功效真的能和跑步相当吗? 椭圆机锻炼,不把活动把手,只是把着活动把手中间的固定把盘,有什么危害吗? 怎样才能选一款满意的椭圆机? 椭圆机减肥效果怎么样呢?每天需要练多久呢有用过的吗? 椭圆机10的阻力,每次45分钟。一天2次。多久能有明显减脂效果 航模制作资料 什么牌子的椭圆机性价比更高? 动感单车和跑步机 哪个减肥效果好 椭圆机的反重力踏板是怎么回事? 生完孩子能瘦吗?产后妈妈怎么减肥?谁知道 运动是最好的护肤品 仙女们每天坚持锻炼吗 请问南京哪里有卖椭圆机的? 减脂还是增肌,这是个问题! 我的QQ号被人给盯上了怎么办? QQ附近,的野鸡天天加我,好烦,怎么可以屏蔽他们?在线等,急!