繁体   English   中英

Malloc 结构数组的数组

[英]Malloc an array of an array of structs

目标

动态创建 Element 结构体数组的数组(定义如下)

typedef struct {
    void* data;
    } Element;

问题

我知道如何 malloc 元素结构数组

Element* arrayOfElements = malloc(4 * sizeof(Element));

但是,我如何分配上述数组呢? (arrayOfElements 的数组)

问题 2

假设 arrayOfElements 数组称为 arrayOfArrayStruc 我将如何继续在其中设置值

例如,我想将 65 复制到 arrayOfArrayStruc 1内的 arrayOfElements[2] 中,我该怎么办?

如果我想将 65 直接复制到 arrayOfElements[2],我知道该怎么做

arrayOfElements[2].data = malloc( sizeof(int) );
ptr = arrayOfElements[2].data;
*ptr = 65;

但如果 arrayOfElements[2] 位于 arrayOfArrayStruc 1内,我不知道该怎么做。

编辑

为了更清楚我的目标,我做了一张照片

我的目标图

所以绿色是由定义的结构元素

typedef struct {
    void* data;
    } Element;

然后在红色(有 4 个绿色框)是我 malloc 使用的元素结构数组

Element* arrayOfElements = malloc(4 * sizeof(Element));

我想要做的是将上面的 ^^ 存储在一个数组中或创建一个指针数组(这是带有红色框的蓝色框)

所以在图片中“元素数组”包含4个元素结构,然后我想制作一个数组来存储4个“元素数组”(或指向每个“元素数组”的4个指针的数组)

arrayOfElements是指针变量的名称。 您不能拥有名称数组。

你可以有一个指针变量数组。 您可以为此编写代码,它与 int 数组的代码相同,但使用指针类型而不是 int。 然后,您需要像现在一样初始化数组中的每个指针变量。

但是,正如发布的那样,问题要求“数组数组”,而不是“指针数组”。 “数组数组”是元素类型为数组(不是指针)的数组。

这是一个非动态分配的数组: int x[4][5]; . 这是一个包含 4 个元素的数组,每个元素都是一个包含 5 个整数的数组。

要动态分配其中一个,它与动态分配任何 4 个元素的数组的代码相同。 我们只是使用int[5]作为元素类型,而不是int或其他什么。

指向第一个元素的指针的类型是:“指向int[5]指针”。 在 C 语法中,这被写成int (*)[5] -- 而不是int *[5] ,后者是一个指针数组。

编写代码的一种方法是:

int (*px)[5] = malloc(4 * sizeof(int[5]));

希望您能在您的问题中看到这与malloc之间的相似性。 我们只是用int[5]替换了Element (所以,你现在的工作是使用Element[5]而不是int[5] 。或者任何大小而不是5 )。

为了避免重复(从而避免出现错误的可能性),可以使用常见的习语:

int (*px)[5] = malloc(4 * sizeof *px);

这是 4 个元素,每个元素的大小都适合指针指向的内容。

如果你想要一个 Element* 数组,那么你可以做这样的事情,其中n是指针的数量:

Element** arrayOfStructs = malloc( n* sizeof(Element*) ); 

所以对于 n = 4; 你得到一个包含 4 个指针的数组:

结构体数组

+---+
|   | ->
+---+
|   | ->
+---+
|   | ->
+---+
|   | ->
+---+

现在为 arrayOfStructs 中的每个条目分配,所以如果m是元素的数量:

for (int i = 0; i < n; ++i)
{
  arrayOfStructs[i] = malloc(m * sizeof(Element));
}

由于每个元素都有一个数据指针,您还需要分配它指向的内容:

for (int i = 0; i < n; ++i)
{
  arrayOfStructs[i] = malloc(m * sizeof(Element));
  for (int j = 0; j < m; ++j)
  {
    arrayOfStructs[i][j].data = malloc(sizeof(int));
  }
}

在此之后,您将在内存中拥有以下内容:

假设 m = 3;

结构体数组

+---+    +---+---+----+
|   | -> |   |   |    |  array of Elements
+---+    +---+---+----+    +---+---+----+
|   | -------------------> |   |   |    |
+---+    +---+---+----+    +---+---+----+
|   | -> |   |   |    |
+---+    +---+---+----+    +---+---+----+
|   | -------------------> |   |   |    |
+---+                      +---+---+----+

“元素数组”1..3(或更确切地说 0..2)中的每个元素都指向不同的“数据”(下面的元素数组旋转 90 度,这样我就可以更轻松地绘制框):

+---+    +---+
|   | -> |   | integer
+---+    +---+   +---+
|   | ---------> |   |
+---+            +---+     +---+
|   | -------------------> |   |
+---+                      +---+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM