我正在学习c,并且遇到了存储和管理结构的问题;让我解释一下。
我对Java很熟悉,我开始明白如何在c中正确使用指针和引用。我的目标是制作和存储数百个结构:
struct creature{
int id;
char name[12];
}
在java中,我可以创建一个像:
这样的数组creature c [];
然后存储和操作该数组中的对象。我希望使用结构“生物”在c中产生相同的效果。
我的第一次尝试是:
creature *creatures = malloc(sizeof(creature));
我不完全确定那甚至是什么。我的目标是创建一个严格保存结构指针的内存块,比如Java数组。
从这里开始,我想创建新的生物结构,并将它们的指针存储在生物变量中,该变量具有使用malloc分配的内存。
我希望这足以解释我的问题。
谢谢!
答案 0 :(得分: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 *)
,而不是sizeof(creature)
,因为数组是指针,而不是creature
。
然后,每个下一个malloc
创建一个指向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 |
| |
| |
+--------------------+
答案 1 :(得分:1)
你快到了。 malloc
将您要分配的字节数作为参数,因此您需要将struct的大小乘以您要分配的结构数:
int number_of_creatures = 10;
creature *creatures = malloc(sizeof(creature) * number_of_creatures);
您还应始终检查malloc()
返回的指针以检查分配是否成功
if (creatures == NULL)
printf("Allocating memory failed!\n");