零长度数组问题

sun4216 2003-08-13 01:17:54
在微软DDK中有这么一段:
typedef struct _USB_NODE_CONNECTION_INFORMATION {
ULONG ConnectionIndex;
// usb device descriptor returned by this device
// during enumeration
USB_DEVICE_DESCRIPTOR DeviceDescriptor;
UCHAR CurrentConfigurationValue;
BOOLEAN LowSpeed;

BOOLEAN DeviceIsHub;

USHORT DeviceAddress;

ULONG NumberOfOpenPipes;

USB_CONNECTION_STATUS ConnectionStatus;
USB_PIPE_INFO PipeList[0];
} USB_NODE_CONNECTION_INFORMATION, *PUSB_NODE_CONNECTION_INFORMATION;
为什么会有一个零长度的PipeList呢?
...全文
60 4 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
alphasun 2003-08-18
这种用法比较诡异,c++编译器可能对此颇感不快。但是这个用法是正确的。我上面给的地址等效有误,正确的应该是:
&usb.PipeList[0] == &usb + sizeof(USB_PIPE_INFO);
&usb.PipeList[i] == &usb + (i+1)*sizeof(USB_PIPE_INFO);

结构成员USB_PIPE_INFO PipeList[0]; 并不占用实际的空间,也就是说 sizeof(USB_PIPE_INFO); 中并没有他。
但是它代表了这个结构的末地址,而对他取下标 i, 的可以得到结构末地址之后的地址。
这其实是利用了 c/c++ 语法的指针的特性,来实现结构中的一个边长度的数组。

结构中这样的数组只能有一个,两个就办不到了。
  • 打赏
  • 举报
回复
sun4216 2003-08-16
恕小弟之愚,我还是不明白两位的意思: alphasun兄说的联系上下文看,应该是对的,该程序段在C中编译可通过,在C++中编译就有警告;但据我所知,变长数组是在C99中才有的,参数是变量,可这里是零呀? alphasun兄说的让我如坠云雾.敢请赐教!
  • 打赏
  • 举报
回复
alphasun 2003-08-14
USB_NODE_CONNECTION_INFORMATION usb;

请看如下地址等效
&usb.PipeList[0] == &usb
&usb.PipeList[1] == &usb + sizeof(USB_PIPE_INFO);
&usb.PipeList[2] == &usb + 2*(sizeof(USB_PIPE_INFO));

明白了吗?

============================================================================
提问题时标题要简明扼要地说明问题内容,切忌使用"急","求救"之类不能说明问题的标题
http://www.betajin.com/alphasun/ 遇到问题可以给我发消息,给我发信息时请附带原帖地址
http://alphasun.free-host.com/
DocWizard C++程序文档自动生成工具 | Wave OpenGL | HttpProxy | AjaxParser词法分析
  • 打赏
  • 举报
回复
ZouMorn 2003-08-14
这是告诉你这个成员数组是不定长的,要么通过其他的参数或者总共的大小可以求出这个成员的大小。
  • 打赏
  • 举报
回复
相关推荐
发帖
进程/线程/DLL
加入

1.5w+

社区成员

VC/MFC 进程/线程/DLL
申请成为版主
帖子事件
创建了帖子
2003-08-13 01:17
社区公告
暂无公告