你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

[关于void*指针的用法]

[复制链接]
andeyqi 提问时间:2019-4-25 20:18 /
本帖最后由 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这个数字通过值的方式传递,而不是通过地址传递,不过传的是个非法地址出现死机,如果是个合法地址,那么代码就会使用未知的值。


收藏 评论15 发布时间:2019-4-25 20:18

举报

15个回答
Kevin201707 回答时间:2019-4-25 23:05:20
用指针好些吧
edmundlee 回答时间:2019-4-26 00:12:14
值6直接赋给给void* data, 这不是个问题, 只能说是使用接口的说明没写清楚而已。
andeyqi 回答时间:2019-4-26 07:41:33
edmundlee 发表于 2019-4-26 00:12
值6直接赋给给void* data, 这不是个问题, 只能说是使用接口的说明没写清楚而已。 ...

对,问题倒不是什么问题接口描述清楚就行,这样除非又什么特殊的考虑,要不感觉没啥必要,怎么都要传个参数,传值或者传址,从设计的角度看感觉完全没有必要。
stary666 回答时间:2019-4-26 09:22:59
看看,,,,,
qiangtech 回答时间:2019-4-26 09:23:06
团队开发还是越简单越直白越好吧,你不能要求别人同样的想法同样的知识结构,最后能不能弄懂另说,问题是容易浪费很多时间。至于个人的话,想怎么用就怎么用,只要你做出来的稳定可靠就是好的。
andeyqi 回答时间:2019-4-26 09:45:00
qiangtech 发表于 2019-4-26 09:23
团队开发还是越简单越直白越好吧,你不能要求别人同样的想法同样的知识结构,最后能不能弄懂另说,问题是容 ...

嗯,至少对外提供的接口要简单明了,不能一味的“”炫技“”,内部代码如果考虑以后别人维护的成本的话感觉也应该别让人有歧义,非要这么写的的话至少注释要写的清晰明了,便于让人理解。
wh8 回答时间:2019-4-26 10:16:10
这种void*做传入参数的函数的一个好处是适用于函数指针吧,比如我有个“需要做“判断相等”的操作,但我想判断的参数支持整型,浮点,或者字符串,我根据不同的情况调用一个函数指针指向的不同函数执行。那么函数指针定义时参数也就是不能事先定义类型了,就可以用用void*。
lmyyjx 回答时间:2019-4-26 12:17:23
学习了
maxtch 回答时间:2019-4-26 13:13:15
写代码的时候不能忽略编译器警告啊。
12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版