[英]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.