关于使用一个长度为0的数组来实现变长结构体

Terryjia 2008-12-08 10:10:12
我听人家说这种用法不推荐在项目里使用,可能会出错,是这样吗?
还有我定义这个长度为0的数组的时候编译出错,定义一个长度为1的就OK,这是怎么回事?
...全文
339 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
nizhaorong 2008-12-11
  • 打赏
  • 举报
回复

顶楼上,直接往后加,若设为1,移植就有问题了
Terryjia 2008-12-10
  • 打赏
  • 举报
回复
UP下
饶鹏 2008-12-10
  • 打赏
  • 举报
回复
就是像iostream那样,直接把所有数据依次用<<运算符输入进内存里,所有数据的长度的和即为总数据长度。
使用的时候把内存首地址往上面那个类里一套,就可以直接用了。要转到下一个对象,就增加一个成员函数:

BYTE* Next() {return (char *)m_pA + sizeof(int) + Len();}

Terryjia 2008-12-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fenghou1st 的回复:]
不要用结构体,用数据流形式就行了。实在想用结构体模式,可以这样:


C/C++ codeclass A
{
BYTE *m_pA;
public:
A(BYTE *pA) : m_pA(pA) {}

int Len() {return *(int *)m_pA;}
char Buf(size_t n = 0) {return *((char *)m_pA + sizeof(int) + n);}
};

int asdf(BYTE *pMem)
{
A aaa(pMem);
int nLen = aaa.Len();
char Buf0 = aaa.Buf();
char Buf100 = aa…
[/Quote]

能说下怎么用数据流吗?谢谢
饶鹏 2008-12-10
  • 打赏
  • 举报
回复
不要用结构体,用数据流形式就行了。实在想用结构体模式,可以这样:

class A
{
BYTE *m_pA;
public:
A(BYTE *pA) : m_pA(pA) {}

int Len() {return *(int *)m_pA;}
char Buf(size_t n = 0) {return *((char *)m_pA + sizeof(int) + n);}
};

int asdf(BYTE *pMem)
{
A aaa(pMem);
int nLen = aaa.Len();
char Buf0 = aaa.Buf();
char Buf100 = aaa.Buf(100);
};
用户 昵称 2008-12-09
  • 打赏
  • 举报
回复
从逻辑上讲,长度若为0,实体就不存在,虽然理论上也说的过去,比如“屋里有0个箱子”。俺倾向于长度至少为1.
Terryjia 2008-12-09
  • 打赏
  • 举报
回复
那么还有什么别的方法实现类似的变长结构体的那?这种需求很多吧,比如通信协议之间的请求N个信息的命令
饶鹏 2008-12-08
  • 打赏
  • 举报
回复
确实容易出错。
比如你现在要申请一个存放结构体实例(其中变长数组长度为N)的内存空间,你要申请多少字节的内存?


struct A
{
int nLen;
char pBuf[1];
};

用VC编译时,如果编译时内存最大对齐模数设为默认,则要申请的内存字节数为:

size_t nMaxAlign = sizeof(结构体中对齐要求最严格的类型);
size_t nVarAlign = sizeof(变长数组元素类型);
size_t nBufSize = sizeof(A) - nMaxAlign + (nVarAlign * N + nMaxAlign - 1) / nMaxAlign * nMaxAlign;

1. 这个结构体中对齐要求最严格的类型是需要人工确定的,因此正确性很难保证。
2. 如果改变最大对齐模数,计算方法又会不同。
3. 如果这个数据要在两个分别编译的模块里使用,那么就很难保证其最大对齐模数设置相同,即很难保证读取到的是正确位置的数据。
wocow3 2008-12-08
  • 打赏
  • 举报
回复
确实有这种写法,不过不具有移植性
比较花哨
ilovedrv 2008-12-08
  • 打赏
  • 举报
回复
这种做法在内核里面多了,有什么问题吗

还有我定义这个长度为0的数组的时候编译出错,定义一个长度为1的就OK,这是怎么回事?

这个跟编译器有关,vc是要用1的
zaodt 2008-12-08
  • 打赏
  • 举报
回复
你说的是不是 C++ 中的 new 和 delete 吧?

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧