OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 49803|回复: 308

【每日一题:0531练习题扩展学习】大家看看这个函数错在哪里?有哪些方法可以更正?

  [复制链接]

302

主题

1422

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
7849
金钱
7849
注册时间
2015-10-15
在线时间
2870 小时
发表于 2020-6-1 18:49:32 | 显示全部楼层 |阅读模式
本贴内容关联帖子:www.openedv.com/thread-311831-1-1.html
对于C语言比较熟悉的同学,一眼就能看出来。对于C语言使用不多的同学,可能就经常遇到这个问题了。
大家说说这个函数错在哪里? 有哪些方法可以更正?

  1. int* Test(int x, int y)
  2. {
  3.     int result=0;//这里为什么要使用static?还有其他办法吗?
  4.     if (x > y)
  5.     {
  6.              result=x-y;
  7.      
  8.     }
  9.     else
  10.     {
  11.              result=y-x;
  12.     }
  13.      return &result;
  14. }
复制代码



这里我们有两个简单的方法,大家回复后查看
游客,如果您要查看本帖隐藏内容请回复

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
975
金钱
975
注册时间
2016-3-8
在线时间
267 小时
发表于 2020-6-1 23:00:44 | 显示全部楼层
局部变量是不允许返回地址(指针)的。应为局部变量在栈区,函数返回就会释放被其他程序使用。就算正常返回地址,那地址上的数据也是不确定,不可控的。因为可能已经被其他程序改变了。可以说返回了一个野指针。。
而变量被static修饰,那么本质上就不是一个局部变量了。而是和全局变量等价的。只是规定这个“全局变量”只能这个函数局部使用。
但这并不代表楼主的这个函数不能被编译或执行。。因为从语法上是没错的,能不能编译和执行看的是编译器和硬件平台。有些编译器能检查出这种错误。有些则不会报错,只有执行时可能会因为地址或数据错误导致程序异常。。
从事嵌入式的小伙伴们一定要仔细避免这类问题,因为一些低端的嵌入式平台,编译器大都稀烂,没那么智能给你规避这些问题。所以语言不规范就是给自己挖坑。
回复 支持 6 反对 0

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1665
金钱
1665
注册时间
2016-4-29
在线时间
266 小时
发表于 2020-6-12 11:52:02 | 显示全部楼层
int Test(int x,inty)
{
....省略
return result

}

回复 支持 2 反对 0

使用道具 举报

33

主题

983

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7920
金钱
7920
注册时间
2014-8-13
在线时间
1587 小时
发表于 2020-6-1 23:28:38 | 显示全部楼层
函数return之后,临时result被回收(或者销毁),此时获取并使用result的指针是非常危险的,不能确定对象是否存在(那个地址是还存在的,不确定你是否能用)。
如果把他转化成汇编,原因就更加一目了然了
回复 支持 2 反对 0

使用道具 举报

0

主题

4

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2019-5-11
在线时间
24 小时
发表于 2020-6-1 19:14:02 | 显示全部楼层
是不是需要把result设置为指针
回复 支持 反对

使用道具 举报

9

主题

120

帖子

0

精华

高级会员

Rank: 4

积分
700
金钱
700
注册时间
2020-5-11
在线时间
67 小时
发表于 2020-6-1 21:13:47 | 显示全部楼层
是错在后面&result吗?
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2020-1-29
在线时间
30 小时
发表于 2020-6-1 22:49:03 | 显示全部楼层
111111111
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

高级会员

Rank: 4

积分
933
金钱
933
注册时间
2018-3-29
在线时间
139 小时
发表于 2020-6-2 08:48:32 | 显示全部楼层
1111111111111
回复 支持 反对

使用道具 举报

26

主题

1564

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6513
金钱
6513
注册时间
2015-8-25
在线时间
1016 小时
发表于 2020-6-2 08:59:30 | 显示全部楼层
result是局部变量,定义在栈上,在return时已经销毁,无法返回其地址
修改:加static将result定义到静态存储区,或者定义为全局变量
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复 支持 反对

使用道具 举报

1

主题

34

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1617
金钱
1617
注册时间
2019-4-22
在线时间
310 小时
发表于 2020-6-2 09:37:43 | 显示全部楼层
result没有使用静态static,用完就会释放,而且return返回的是地址,不是计算出来的数据
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-11-25
在线时间
3 小时
发表于 2020-6-2 10:09:46 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

302

主题

1422

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
7849
金钱
7849
注册时间
2015-10-15
在线时间
2870 小时
 楼主| 发表于 2020-6-2 11:13:53 | 显示全部楼层
大家都很踊跃,回答基本都是正确的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2020-4-3
在线时间
29 小时
发表于 2020-6-2 11:14:17 | 显示全部楼层
result变量设置为static ,每次调用result地址不会改变
回复 支持 反对

使用道具 举报

0

主题

87

帖子

0

精华

高级会员

Rank: 4

积分
860
金钱
860
注册时间
2018-4-20
在线时间
481 小时
发表于 2020-6-2 11:29:00 | 显示全部楼层
顶顶顶顶顶
回复 支持 反对

使用道具 举报

5

主题

269

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1050
金钱
1050
注册时间
2020-5-11
在线时间
252 小时
发表于 2020-6-2 11:55:59 | 显示全部楼层
result改为全局变量也可以
回复 支持 反对

使用道具 举报

1

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
323
金钱
323
注册时间
2018-10-21
在线时间
107 小时
发表于 2020-6-2 16:25:11 | 显示全部楼层
666666666666
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不
回复 支持 反对

使用道具 举报

31

主题

94

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2016-6-16
在线时间
46 小时
发表于 2020-6-2 16:30:24 | 显示全部楼层
学习一下,
回复 支持 反对

使用道具 举报

1

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
349
金钱
349
注册时间
2020-5-16
在线时间
52 小时
发表于 2020-6-3 13:37:33 | 显示全部楼层
int* Test(int x, int y)
{
    int *result=0;//这里为什么要使用static?还有其他办法吗?
    if (x > y)
    {
             *result=x-y;
     
    }
    else
    {
             *result=y-x;
    }
     return &result;
}
回复 支持 反对

使用道具 举报

5

主题

54

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2020-5-25
在线时间
85 小时
发表于 2020-6-3 16:37:32 | 显示全部楼层
11111111111
回复 支持 反对

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2020-2-14
在线时间
33 小时
发表于 2020-6-3 21:46:21 | 显示全部楼层
函数里面的都是局部变量,在函数存在时候,该数据存在,当函数结束时候,内容都被销毁,返回的指针就是野指针。解决方法,一般是定义一个全局变量(static)或者在里面申请动态内存。具体如何使用,根据情况而定。
回复 支持 反对

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2020-2-14
在线时间
33 小时
发表于 2020-6-3 21:46:45 | 显示全部楼层
滴滴滴滴,感谢感谢
回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

高级会员

Rank: 4

积分
653
金钱
653
注册时间
2017-5-29
在线时间
139 小时
发表于 2020-6-4 21:25:28 | 显示全部楼层
static 修饰后,一直不释放
回复 支持 反对

使用道具 举报

0

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2013-12-6
在线时间
45 小时
发表于 2020-6-5 14:04:07 | 显示全部楼层
1111111
回复 支持 反对

使用道具 举报

0

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2018-4-24
在线时间
61 小时
发表于 2020-6-5 14:09:32 | 显示全部楼层
1111111
回复 支持 反对

使用道具 举报

1

主题

20

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-5-23
在线时间
9 小时
发表于 2020-6-8 08:54:05 | 显示全部楼层
返回为空
回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2013-5-22
在线时间
10 小时
发表于 2020-6-8 22:24:11 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2018-1-2
在线时间
46 小时
发表于 2020-6-9 11:00:47 | 显示全部楼层
顶一下
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2019-10-18
在线时间
19 小时
发表于 2020-6-9 11:56:15 | 显示全部楼层
123321
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-1-14
在线时间
12 小时
发表于 2020-6-9 14:51:56 | 显示全部楼层
使用关键字static修饰result
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2020-6-7
在线时间
13 小时
发表于 2020-6-9 19:15:42 | 显示全部楼层
每日学习
回复 支持 反对

使用道具 举报

36

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2018-7-1
在线时间
76 小时
发表于 2020-6-11 10:23:48 | 显示全部楼层
看看,。
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
467
金钱
467
注册时间
2017-12-20
在线时间
60 小时
发表于 2020-6-11 10:30:35 | 显示全部楼层
看看是什么情况
回复 支持 反对

使用道具 举报

4

主题

26

帖子

0

精华

高级会员

Rank: 4

积分
643
金钱
643
注册时间
2020-2-26
在线时间
79 小时
发表于 2020-6-11 16:23:41 | 显示全部楼层
不适用static,在函数中定义的变量会被释放
回复 支持 反对

使用道具 举报

0

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2019-8-15
在线时间
64 小时
发表于 2020-6-12 09:15:54 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

18

主题

89

帖子

0

精华

高级会员

Rank: 4

积分
799
金钱
799
注册时间
2016-5-12
在线时间
172 小时
发表于 2020-6-12 09:27:29 | 显示全部楼层
局部变量?????
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-1-13
在线时间
9 小时
发表于 2020-6-12 11:11:54 | 显示全部楼层
啊啊啊啊啊啊啊
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-7-1
在线时间
14 小时
发表于 2020-6-12 15:51:44 | 显示全部楼层
111111111
回复 支持 反对

使用道具 举报

5

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
333
金钱
333
注册时间
2015-2-9
在线时间
92 小时
发表于 2020-6-12 16:36:59 | 显示全部楼层
看答案
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2019-9-22
在线时间
35 小时
发表于 2020-6-12 17:10:58 | 显示全部楼层
6666666666666666
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2018-9-23
在线时间
6 小时
发表于 2020-6-14 09:38:01 | 显示全部楼层
了解学习下。
回复 支持 反对

使用道具 举报

0

主题

26

帖子

0

精华

高级会员

Rank: 4

积分
582
金钱
582
注册时间
2018-4-16
在线时间
107 小时
发表于 2020-6-15 09:07:25 | 显示全部楼层
result用static修饰
result作为全局变量
result从外部传入
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-7-7
在线时间
7 小时
发表于 2020-6-22 22:43:21 | 显示全部楼层
不错的学习贴
回复 支持 反对

使用道具 举报

10

主题

161

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2019-9-5
在线时间
134 小时
发表于 2020-6-24 09:17:35 | 显示全部楼层
局部变量离开函数后就会被清除掉,返回的指针指向null
回复 支持 反对

使用道具 举报

0

主题

37

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1119
金钱
1119
注册时间
2018-5-24
在线时间
117 小时
发表于 2020-6-26 12:02:07 | 显示全部楼层
在栈中的值会变
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2020-6-28
在线时间
3 小时
发表于 2020-6-29 11:16:43 | 显示全部楼层
return 返回的值错误
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2019-6-5
在线时间
39 小时
发表于 2020-6-29 11:27:10 | 显示全部楼层
111111
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-4-27
在线时间
8 小时
发表于 2020-6-29 12:19:25 | 显示全部楼层
学习一下
回复 支持 反对

使用道具 举报

1

主题

37

帖子

0

精华

高级会员

Rank: 4

积分
976
金钱
976
注册时间
2019-9-1
在线时间
194 小时
发表于 2020-6-29 19:45:06 | 显示全部楼层
学习一下
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2020-3-27
在线时间
20 小时
发表于 2020-6-30 15:30:03 来自手机 | 显示全部楼层
pppppp
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2020-6-23
在线时间
10 小时
发表于 2020-6-30 17:27:36 | 显示全部楼层
没看懂  学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-1-18 21:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表