我正在学习c,遇到了存储和管理结构的问题;让我解释一下。
我对Java非常熟悉,并且开始了解如何在c中正确使用指针和引用。我的目标是制作和存储数百个stuct:

struct creature{
  int id;
  char name[12];
}

在java中,我可以创建如下数组:
creature c [];

然后在数组中存储和操作对象。我想在c中使用一个结构“生物”得到同样的效果。
我的第一次尝试是:
creature *creatures = malloc(sizeof(creature));

我不太清楚那到底是怎么回事。我的目标是创建一个严格保存结构指针的内存块,比如Java数组。
从这里开始,我要创建新的生物结构,并将它们的指针存储在“生物”变量中,该变量使用malloc分配内存。
我希望这足够解释我的问题。
谢谢!

最佳答案

对,所以你想要的是一个指针数组。请注意,在Java中,只要您有以下内容:

String s = ...;

这将转换为c中的指针:
String *s = ...;

让我们先来看看固定大小指针数组的简单情况。这很简单:
creature *creatures[10];
for (var i=0; i < 10; i++) {
    creatures[i] = malloc(sizeof(creature));
}

现在你有一个指向生物的指针数组,每个malloced都是独立的。但是,如果你不知道你的生物阵列应该有多大,那么你就必须对这些生物进行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 *),而不是sizeof(creature),因为数组是指针数组,而不是creatures数组。
接下来的每个mallocs都创建一个指向creature的指针,与固定大小数组的情况相同。
确保每个free都有一个malloc——也就是说,每个creature *一个creature **,每个creature一个creature
注意,这与Pankrates建议的不同。你想用哪种方法取决于你想做什么。他创造了一大块
creature *creatures =  +--------------------+
                       |                    |
                       |                    |
                       |     Creature 0     |
                       |                    |
                       |                    |
                       +--------------------+
                       |                    |
                       |                    |
                       |     Creature 1     |
                       |                    |
                       |                    |
                       +--------------------+
                       |                    |
                       |                    |
                       |     Creature 2     |
                       |                    |
                       |                    |
                       +--------------------+
                       |        ...         |

而mine创建了一个指针数组,每个指针指向一个:
                                             +--------------------+
                                             |                    |
       creature *creatures =  +------+       |                    |
                              | ptr0 | ----> |     Creature 0     |
 +--------------------+       +------+       |                    |
 |                    |   +-- | ptr1 |       |                    |
 |                    |   |   +------+       +--------------------+
 |     Creature 1     | <-+   | ptr2 | --+
 |                    |       +------+   |   +--------------------+
 |                    |       | .... |   |   |                    |
 +--------------------+                  |   |                    |
                                         +-> |     Creature 2     |
                                             |                    |
                                             |                    |
                                             +--------------------+

10-08 12:14