搜索
查看: 2766|回复: 15

[讨论] [关于void*指针的用法]

[复制链接]

该用户从未签到

37

主题

2167

帖子

32

蝴蝶豆

论坛元老

最后登录
2023-2-9
发表于 2019-4-25 20:18:31 | 显示全部楼层 |阅读模式
本帖最后由 andeyqi 于 2019-4-26 09:40 编辑

背景:
今天和同事调试联调代码时出现一个死机,死机的原因是同事对外提供了个类似这样的接口 void fun(type,vodi * data),根据不同的type返回不同的数据类型。不过在出问题的场景同事的接口将一个值6直接赋给给void* data,内部解析时按照指针解析数据,结果可想而知访问非法地址肯定挂了。

主题:
后来和同事讨论下,这样传递值好像不好,传递值应该通过指针来获取数值6,不应该直接将6当作void* 的值传递,讨论半天他一直认为void * 是个万能类型怎么传都行,虽然实现上没有问题,不过个人认为这样对接口的使用者来说很容易出错。而且个人感觉除了有歧义外,这么写没有什么优点,而且通过这种方式能实现的传递地址也都能搞定的,想了半天没想到为什么要这么写,希望和大家讨论下看看大家有什么高见。

后续:
  1. func1(int type,void * data)
  2. {
  3.        
  4. }


  5. /* system entry point */
  6. int main(void)
  7. {
  8.         int i = 6;
  9.         func(1,6);
  10. }
复制代码
这种写法隔个人能想到的优势是:
上述的伪代码中可以少定义一个变量,不需要定义int i ,6这个数字通过值的方式传递,而不是通过地址传递,不过传的是个非法地址出现死机,如果是个合法地址,那么代码就会使用未知的值。


回复

使用道具 举报

该用户从未签到

6

主题

1029

帖子

133

蝴蝶豆

金牌会员

最后登录
2021-4-24
发表于 2019-4-25 23:05:20 | 显示全部楼层
用指针好些吧
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

246

帖子

172

蝴蝶豆

金牌会员

最后登录
2021-3-26
发表于 2019-4-26 00:12:14 | 显示全部楼层
值6直接赋给给void* data, 这不是个问题, 只能说是使用接口的说明没写清楚而已。
回复 支持 反对

使用道具 举报

该用户从未签到

37

主题

2167

帖子

32

蝴蝶豆

论坛元老

最后登录
2023-2-9
 楼主| 发表于 2019-4-26 07:41:33 | 显示全部楼层
edmundlee 发表于 2019-4-26 00:12
值6直接赋给给void* data, 这不是个问题, 只能说是使用接口的说明没写清楚而已。 ...

对,问题倒不是什么问题接口描述清楚就行,这样除非又什么特殊的考虑,要不感觉没啥必要,怎么都要传个参数,传值或者传址,从设计的角度看感觉完全没有必要。
回复 支持 反对

使用道具 举报

该用户从未签到

100

主题

3786

帖子

1

蝴蝶豆

论坛元老

最后登录
2024-4-24
发表于 2019-4-26 09:22:59 | 显示全部楼层
看看,,,,,
回复

使用道具 举报

该用户从未签到

8

主题

712

帖子

38

蝴蝶豆

论坛元老

最后登录
2021-8-25
发表于 2019-4-26 09:23:06 | 显示全部楼层
团队开发还是越简单越直白越好吧,你不能要求别人同样的想法同样的知识结构,最后能不能弄懂另说,问题是容易浪费很多时间。至于个人的话,想怎么用就怎么用,只要你做出来的稳定可靠就是好的。
回复 支持 反对

使用道具 举报

该用户从未签到

37

主题

2167

帖子

32

蝴蝶豆

论坛元老

最后登录
2023-2-9
 楼主| 发表于 2019-4-26 09:45:00 | 显示全部楼层
qiangtech 发表于 2019-4-26 09:23
团队开发还是越简单越直白越好吧,你不能要求别人同样的想法同样的知识结构,最后能不能弄懂另说,问题是容 ...

嗯,至少对外提供的接口要简单明了,不能一味的“”炫技“”,内部代码如果考虑以后别人维护的成本的话感觉也应该别让人有歧义,非要这么写的的话至少注释要写的清晰明了,便于让人理解。
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

203

帖子

14

蝴蝶豆

金牌会员

最后登录
2020-12-28
发表于 2019-4-26 10:16:10 | 显示全部楼层
这种void*做传入参数的函数的一个好处是适用于函数指针吧,比如我有个“需要做“判断相等”的操作,但我想判断的参数支持整型,浮点,或者字符串,我根据不同的情况调用一个函数指针指向的不同函数执行。那么函数指针定义时参数也就是不能事先定义类型了,就可以用用void*。
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

111

帖子

4

蝴蝶豆

中级会员

最后登录
2020-11-9
发表于 2019-4-26 12:17:23 | 显示全部楼层
学习了
回复

使用道具 举报

该用户从未签到

21

主题

1073

帖子

442

蝴蝶豆

论坛元老

最后登录
2021-5-10
发表于 2019-4-26 13:13:15 | 显示全部楼层
写代码的时候不能忽略编译器警告啊。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-25 19:39 , Processed in 0.197304 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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