提问者:小点点

数组添加数据而不是指向数据的指针


我正在为一个Delphi可执行文件开发一个C++的DLL项目。此可执行文件具有如下结构:

size
data[]

例如:

02 00 00 00 // Size
30 31 32 33 // data[0]
34 35 36 37 // Still data[0]
31 32 33 33 // data[1]
33 33 33 33 // Still data[1]

我试着做了这样的课程:

class LittleList
{
private:
    int32_t size;
    DataType* data;
}

它给了我这个:

02 00 00 00 // Size
xx xx xx xx // Pointer to data (and obviously, there are data[0] and data[1] at this address)

那不是我想要的。

我可以通过使用一个数组来实现我的目标:

class LittleList
{
private:
    int32_t size;
    DataType data[2];
}

但是,我被迫有一个固定的长度,这仍然不是我想要的。

我想了一个肮脏的解决办法:

class LittleList
{
private:
    char* data;
    // Storing size at data[0] ~ data[3]
    // and the actual data from data[4] to data[...]

}

但要解析、读取和写入它真的很难。

这样的问题有没有干净的解决方案?

顺便说一下,这不是一个XY问题


共1个答案

匿名用户

您实际上是在解释数据,因此在这里使用reinterpret_cast是有效的。不要太害怕未定义的行为--使用Delphi本身就是未定义的行为。

最简单的方法似乎是

private:
DataType& at(size_t i) { 
  assert(i<size);
  return reinterpret_cast<DataType*>(&size+1)[i];
}

然后将其用作构建块。