1

我正在学习 c,并且遇到了存储和管理结构的问题;让我解释。

我对Java非常熟悉,并且开始了解如何在c中正确使用指针和引用。我的目标是制作和存储数百个结构:

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

在java中,我可以创建一个像这样的数组:

creature c [];

然后在该数组中存储和操作对象。我希望使用结构“生物”在 c 中获得相同的效果。

我的第一次尝试是:

creature *creatures = malloc(sizeof(creature));

我不完全确定那是什么。我的目标是创建一个严格保存结构指针的内存块,例如 Java 数组。

从这里开始,我想创建新的生物结构,并将它们的指针存储在生物变量中,该变量具有使用 malloc 分配的内存。

我希望这是足够的信息来解释我的问题。

谢谢!

4

2 回答 2

3

对,所以你想要的是一个指针数组。请注意,在 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),因为数组是指针,而不是creatures。

接下来的每个mallocs 然后创建一个指向 a 的指针creature,与固定大小数组的情况相同。

确保free每个都有一个malloc- 即每个creature *一个,一个creature **.

请注意,这与Pankrates建议的不同。您要使用哪种解决方案取决于您要做什么。他创建了一大块creatures:

creature *creatures =  +--------------------+
                       |                    |
                       |                    |
                       |     Creature 0     |
                       |                    |
                       |                    |
                       +--------------------+
                       |                    |
                       |                    |
                       |     Creature 1     |
                       |                    |
                       |                    |
                       +--------------------+
                       |                    |
                       |                    |
                       |     Creature 2     |
                       |                    |
                       |                    |
                       +--------------------+
                       |        ...         |

而我的创建了一个指针数组,每个指针指向一个creature

                                             +--------------------+
                                             |                    |
       creature *creatures =  +------+       |                    |
                              | ptr0 | ----> |     Creature 0     |
 +--------------------+       +------+       |                    |
 |                    |   +-- | ptr1 |       |                    |
 |                    |   |   +------+       +--------------------+
 |     Creature 1     | <-+   | ptr2 | --+
 |                    |       +------+   |   +--------------------+
 |                    |       | .... |   |   |                    |
 +--------------------+                  |   |                    |
                                         +-> |     Creature 2     |
                                             |                    |
                                             |                    |
                                             +--------------------+
于 2013-09-30T22:32:13.087 回答
1

你快到了。malloc将要分配的字节数作为参数,因此您需要将结构的大小乘以要分配的结构数:

int number_of_creatures = 10;
creature *creatures = malloc(sizeof(creature) * number_of_creatures);

您还应该始终检查返回的指针malloc()以检查分配是否成功

if (creatures == NULL)
    printf("Allocating memory failed!\n");
于 2013-09-30T22:29:40.720 回答