Malloc结构数组的数组

时间:2016-10-21 03:17:04

标签: c arrays struct

目标

动态创建Element strucs数组的数组(在下面定义)

typedef struct {
    void* data;
    } Element;

问题

我知道如何malloc一个Element strucs数组

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

但那么我怎么把Malloc上面的数组? (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中,我不知道怎么做。

修改

为了让我的目标更清晰,我已经制作了一张照片

Diagram Of my goal

因此,绿色是由

定义的结构元素
typedef struct {
    void* data;
    } Element;

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

进行了malloc
Element* arrayOfElements = malloc(4 * sizeof(Element));

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

所以在图片中“Array Of Element”拥有4个Element Structure,然后我想创建一个数组来存储4个“Element of Element”(或者一个4个指针的数组,指向每个“Element of Element”)< / p>

2 个答案:

答案 0 :(得分:1)

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之间的相似性。我们刚刚将Element替换为int[5]。 (所以,你现在的工作就是使用Element[5]代替int[5]。或者使用5代替大小。

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

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

这是4个元素,每个元素都是指针所指向的正确大小。

答案 1 :(得分:1)

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

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

所以n = 4;你得到一个4指针数组

arrayOfStructs

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

现在为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;

arrayOfStructs

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

“元素数组”1..3(或更确切地说是0..2)中的每个元素指向不同的“数据”(元素数组下方转动90度左右,因此我可以更轻松地绘制框)< / p>

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