对,所以你想要的是一个指针数组。请注意,在 Java 中,只要您有类似的内容:
String s = ...;
这转换为 c 中的指针:
String *s = ...;
让我们先来看一个固定大小的指针数组的简单情况。这很简单:
creature *creatures[10];
for (var i=0; i < 10; i++) {
creatures[i] = malloc(sizeof(creature));
}
现在你有一个指向生物的指针数组,每个指针都是单独分配的。但是,如果你不知道你的生物数组应该有多大,那么你必须 malloc 生物数组。请注意,如果您有一个 malloced int 数组,您将执行以下操作:
int *ints = malloc(sizeof(int) * 10);
ints[0]; ints[1]; //etc...
也就是说,数组表示为指向第一个元素的指针。你现在想要的是一个指针数组,它最终是一个指向指针的指针:
var numCritters = 10;
creature **creatures = malloc(sizeof(creature *) * numCritters);
for (var i=0; i < numCritters; numCritters++) {
creatures[i] = malloc(sizeof(creature));
}
第一个malloc
创建指向指针数组的creature *
指针。注意我们sizeof(creature *)
在这里使用 not sizeof(creature)
,因为数组是指针,而不是creature
s。
接下来的每个malloc
s 然后创建一个指向 a 的指针creature
,与固定大小数组的情况相同。
确保free
每个都有一个malloc
- 即每个creature *
一个,一个creature **
.
请注意,这与Pankrates建议的不同。您要使用哪种解决方案取决于您要做什么。他创建了一大块creature
s:
creature *creatures = +--------------------+
| |
| |
| Creature 0 |
| |
| |
+--------------------+
| |
| |
| Creature 1 |
| |
| |
+--------------------+
| |
| |
| Creature 2 |
| |
| |
+--------------------+
| ... |
而我的创建了一个指针数组,每个指针指向一个creature
:
+--------------------+
| |
creature *creatures = +------+ | |
| ptr0 | ----> | Creature 0 |
+--------------------+ +------+ | |
| | +-- | ptr1 | | |
| | | +------+ +--------------------+
| Creature 1 | <-+ | ptr2 | --+
| | +------+ | +--------------------+
| | | .... | | | |
+--------------------+ | | |
+-> | Creature 2 |
| |
| |
+--------------------+