当前位置: 首页 > 知识库问答 >
问题:

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

太叔鸿博
2023-03-14

我正在为一个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个答案

尚俊楠
2023-03-14

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

最简单的方法似乎是

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

然后将其用作构建块。

 类似资料:
  • 主要内容:关于数组指针的谜题数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element)。数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存。以 为例,该数组在内存中的分布如下图所示: 定义数组时,要给出数组名和数组长度,数组名可以认为是一个 指针,它指向数组的第 0 个元素。 在C语言中,我们将第 0 个元素的地址称为数组的首地址。以上面的数组为例,下图是 arr 的指向:

  • 我想做的是将一个Map添加到一个ArrayList中,然后添加到一个JsonArray中。我打算做的是直接将映射添加到json数组中。

  • C++ 数组 您可以先跳过本章,等了解了 C++ 指针的概念之后,再来学习本章的内容。 如果您对 C++ 指针的概念有所了解,那么就可以开始本章的学习。数组名是一个指向数组中第一个元素的常量指针。因此,在下面的声明中: double balance[50]; balance 是一个指向 &balance[0] 的指针,即数组 balance 的第一个元素的地址。因此,下面的程序片段把 p 赋值

  • 在 C 语言中,数组名,&数组名,&数组首元素保存的都是同一个地址 #include <stdio.h> int main(){ int arr[3] = {1, 3, 5}; printf("%p\n", arr); // 0060FEA4 printf("%p\n", &arr); // 0060FEA4 printf("%p\n", &a

  • 主要内容:指针数组和二维数组指针的区别二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }; 从概念上理解,a 的分布像一个矩阵: 但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存: C语言中的二维数组是按行排列的,也就是先存放

  • 7. 指向数组的指针与多维数组 指针可以指向复合类型,上一节讲了指向指针的指针,这一节学习指向数组的指针。以下定义一个指向数组的指针,该数组有10个int元素: int (*a)[10]; 和上一节指针数组的定义int *a[10];相比,仅仅多了一个()括号。如何记住和区分这两种定义呢?我们可以认为[]比*有更高的优先级,如果a先和*结合则表示a是一个指针,如果a先和[]结合则表示a是一个数组。