我正在做一个需要 malloc 一些数据的项目。我试图通过改变我使用的主要结构值来减少程序的堆峰值。我正在使用链接列表。我的结构是这样的:
struct myS{
int a,b;
float a,b;
struct myS *next;
};
我在想,不是分配结构指针,而是将它存储在一个全局数组中,因为我没有太多数据。我该怎么做?
我正在做一个需要 malloc 一些数据的项目。我试图通过改变我使用的主要结构值来减少程序的堆峰值。我正在使用链接列表。我的结构是这样的:
struct myS{
int a,b;
float a,b;
struct myS *next;
};
我在想,不是分配结构指针,而是将它存储在一个全局数组中,因为我没有太多数据。我该怎么做?
如果你有你需要的元素数量的上限,你可以创建一个全局数组[不是动态分配的],让它成为struct myS heap[]
,和一个整数idx
,初始化为0
。分配元素后,您需要增加idx
,并将此元素附加到请求者。
注意 -只有当您不希望删除元素[或者您可以负担每个元素只分配一次] 时,它才是一个很好的解决方案。
如果您确实需要删除,您将需要分配一个额外的数组来告诉您当前正在使用哪些元素,使idx
循环 [increase with idx = (idx + 1) % size
],并在给它之前检查每个元素是否已分配,但正如我所说 - 它可能会更耗时!
代码快照[不支持删除]:
struct myS heap[SIZE];
int idx = 0;
...
struct myS* allocate() {
return &(heap[idx++]);
}
注意:上面的代码快照是危险的——如果你尝试分配更多的元素,它可能会溢出SIZE
。
你可以这样做:
struct myS myArray[ARRAY_SIZE];
/* ... */
struct myS *head = &myArray[0];
head->next = &myArray[1];
head->next->next = &myArray[2];
/* etc... */
使用的数组索引不必是连续的,例如head
可以是索引3
,head->next
也可以是索引21
如果要初始化列表以一次使用数组中的所有条目,可以循环执行:
struct myS *node = head;
for (int i = 1; i < ARRAY_SIZE; i++)
{
node->next = &myArray[i];
node = &myArray[i];
}
node->next = NULL; /* Make sure the tail of the list doesn't have a 'next' pointer */