结构体里加一个0字节的数组成员是做什么用的?

fishly_0 2008-03-26 10:27:23
比如这个:
struct MyStruct
{
int cnt;
char chDat[0];
}

后面这个char chDat通常是干嘛用的呢?在哪里用的到?
...全文
342 19 打赏 收藏 举报
写回复
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
thinkSJ 2008-09-17
  • 打赏
  • 举报
回复
学习了~!
guocai_yao 2008-03-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 060 的回复:]
程序的设计者不知道这个结构体会存储多长的数据,或者想让这个结构体存储任意长的数据。所以使用这种方式。
使用方法

C/C++ code
struct MyStruct
{
int cnt;
char chDat[0];
}

int i = 15;
MyStruct* pMS;
pMS = new char [4+i];
pMS->cnt = i;
// 这样 pMS 中就存储了一定长度的内容,长度由cnt 记录。



这样的做法比使用,chDat[10],节省空间(数据长度不定,定义结构体时chDat需要的空间应该…
[/Quote]
学习了
wfh_178 2008-03-28
  • 打赏
  • 举报
回复
我怎么没有发现。请问是effective c++中哪章哪节啊?
fishly_0 2008-03-28
  • 打赏
  • 举报
回复
俺是在一次面试时被问到的,面试时太紧张,一下脑子有点晕,反应不过来,也怪自己还没怎么准备,郁闷死了。
多谢大家的回答了。
liveforme 2008-03-28
  • 打赏
  • 举报
回复
学习了
wfh_178 2008-03-27
  • 打赏
  • 举报
回复
我试过MSVC2005的编译器不支持这个特性,编译失败。请问楼主用的什么编译器?
hastings 2008-03-27
  • 打赏
  • 举报
回复
有点像BITMAPINFO结构.
hityct1 2008-03-27
  • 打赏
  • 举报
回复
学习
taodm 2008-03-27
  • 打赏
  • 举报
回复
google “柔性数组成员”
Proteas 2008-03-27
  • 打赏
  • 举报
回复
在Effective C++中看到过,在进行C++程序编写时尽量不要用这种用法.
abupie 2008-03-27
  • 打赏
  • 举报
回复
简单的说:
就是用chDat直接指向cnt后的地址,但是又不占用struct MyStruct 的长度.
abupie 2008-03-27
  • 打赏
  • 举报
回复
比较老的一种写法了. 可变结构体长度.
一般用于网络协议传输字段定义\或者其他数据结构等.
struct MyStruct
{
int cnt; //这个是固定的长度, struct的长度就是这部分的长度
char chDat[0]; //可变的,虚的struct字段,只是为了方便书写代码.不占用结构体实际长度.
}
可以用sizeof(struct MyStruct )验证.

应用范例:
比如一个send()或者recv()的char buff[1024]; 可以这样写:
struct MyStruct * p = (struct MyStruct *) buff;
直接把send,recv的内容强制类型转换为struct MyStruct类型.
然后用p->cnt, 和p->chDat来直接做运算. 方便维护代码.

paidfighting 2008-03-27
  • 打赏
  • 举报
回复
up,用指针取代之
effective_person 2008-03-26
  • 打赏
  • 举报
回复
leaning!!!!
060 2008-03-26
  • 打赏
  • 举报
回复
程序的设计者不知道这个结构体会存储多长的数据,或者想让这个结构体存储任意长的数据。所以使用这种方式。
使用方法

struct MyStruct
{
int cnt;
char chDat[0];
}

int i = 15;
MyStruct* pMS;
pMS = new char [4+i];
pMS->cnt = i;
// 这样 pMS 中就存储了一定长度的内容,长度由cnt 记录。

这样的做法比使用,chDat[10],节省空间(数据长度不定,定义结构体时chDat需要的空间应该很大),而且灵活; 比使用指针(char* chDat)安全,因为char chDat[0]中数组的地址是不可以修改的,而且cnt和chDat是在连续的地址空间里,使用起来也方便。
arong1234 2008-03-26
  • 打赏
  • 举报
回复
这不是结束标致。这个数组是一个占位符,当你在使用这个结构时,你需要把它换成真正的数据域

考虑你需要和某个进程通过socket通信,你和对方商定每个报文的格式是:先发送一个长度信息,然后发送一个类型信息,再发送实际数据,你就可以这样定义

typedef struct
{
unsigned long size;
unsigned char type;
unsigned char data[1]; //我记得一般设置为1长度,0长度不是每个编译器都支持,会又错误
}MESSAGE_TYPE;


当实际使用时,你应该这样分配数据
MESSAGE_TYPE * pMsg = (MESSAGE_TYPE)new char[sizeof(MESSAGE_TYPE)+nDataLength];
memcpy(&pMsg->data[0], pData, nDataLength);
pMsg->type = MY_MSG1;
pMsg->size = sizeof(MESSAGE_TYPE)+nDataLength;


但是这种技术似乎已经不再流行,替代的方法主要有
1. 使用对象的serialization技术,把对象序列化成字节数组
2. 使用消息头技术,把data数组从实际结构中剥离出来,这个就是你们常见的不带0元素数组的方式
gisperson 2008-03-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 effective_person 的回复:]
貌似结构体的地址结束标志!
等待中!
[/Quote]

同意!等待~~~~~~
lzy340623339 2008-03-26
  • 打赏
  • 举报
回复
学习...
effective_person 2008-03-26
  • 打赏
  • 举报
回复
貌似结构体的地址结束标志!
等待中!
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-03-26 10:27
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下