andeyqi 发表于 2019-4-25 20:18:31

[关于void*指针的用法]

本帖最后由 andeyqi 于 2019-4-26 09:40 编辑

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

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

后续:func1(int type,void * data)
{
       
}


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


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

写代码的时候不能忽略编译器警告啊。
页: [1] 2
查看完整版本: [关于void*指针的用法]