搜索
bottom↓
回复: 3

诚恳请教:关于void类型的变量,在线求答!

[复制链接]

出0入0汤圆

发表于 2010-4-7 21:22:30 | 显示全部楼层 |阅读模式
最近在学NUT/OS,在SOCKET API中中发现函数:
NutUdpSendTo (UDPSOCKET *sock, u_long addr, u_short port, void *data, u_short len)
关于void *  data很是不明白,void一般只见于定义函数类型,以前真没见过定义变量的。查了一些相关材料,说GUN标准下是允许的,ANSI标准不允许,仅此而已。
那么我要操作的data到底应该是什么类型的数据呢?比如我要用这个函数发送一个unsigned char my_data[]类型的数组该怎么操作?哪位高人给指点一下,不胜感激?
补充一下我用的是ICC。

出0入0汤圆

 楼主| 发表于 2010-4-7 22:10:37 | 显示全部楼层
自问自答吧……

我刚在内存拷贝函数上找到了答案,无类型就是可以是任意类型,最基本的类型,8位数据。直接操作的是存储区,而不是有特殊意义的数据类型。当然也不必考虑其类型,要考虑的是这一块不论什么东西,我都照单原样搬走,要的只是一个地址和大小。
真是“一个纯粹的,脱离低级趣味的函数!”,解释的太好了!

出0入0汤圆

发表于 2010-4-7 23:43:05 | 显示全部楼层
回答正确,但还不深入。

以下是网上的解释,估计你也是看了这个解释的:
------------------------------------------------------------
规则三 小心使用void指针类型
 按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作,即下列操作都是不合法的:
    void * pvoid;
    pvoid++; //ANSI:错误
    pvoid += 1; //ANSI:错误
  ANSI标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的。例如:
    int *pint;
    pint++; //ANSI:正确
 pint++的结果是使其增大sizeof(int)。

  但是大名鼎鼎的GNU(GNU's Not Unix的缩写)则不这么认定,它指定void *的算法操作与char *一致。
-------------------------------------------------------------

比较关键的是理解最后一句的解释:“GNU指定void *的算法操作与char *一致”。

然后考虑如何正确的使用函数:NutUdpSendTo (UDPSOCKET *sock, u_long addr, u_short port, void *data, u_short len)

这个函数同内存拷贝函数void * memcpy(void *dest, const void *src, size_t len)类似,是把内存中一片连续区域中的数据“按字节”送到另外一个地方。

参数使用 void *data 说明,首先是它可以接受任何类型的指针,然后在函数中是按字节(char)型指针操作的。这样处理,使的这个函数成为所谓“一个纯粹的,脱离低级趣味的函数!”,能够“不必考虑其类型”,连续搬动一段内存数据了。

可是使用起来还是要注意,否则会出现问题,而且对于基础不牢固的人会更搞不清楚,用不好的。

比如,你准备传送int类型(假定占2个字节)的10个数据,那么尽管在调用NutUdpSendTo (UDPSOCKET *sock, u_long addr, u_short port, void *data, u_short len)过程时,你可以直接把int型指针传给void *data,但u_short len必须是20,而不是10!

当你传送一个结构变量指针的话,更要注意这个结构是几个字节的,仔细计算正确的长度。如果不注意,出了问题都不知道为什么,让你找不到北!

指针类型可以不考虑,算是一个“纯粹的,脱离低级趣味”的函数,但要麻烦使用者正确考虑长度,出了问题一概不负责任。我的理解实际是很低级的。

出0入0汤圆

 楼主| 发表于 2010-4-10 22:39:57 | 显示全部楼层
谢谢马老师的回复。
还是马老师的解释比较详尽易于理解,就跟当年看马老师的书开始学AVR单片机时的感觉一样,不愧是大师,讲解深入浅出。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 21:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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