malloc的全局数组

时间:2012-04-13 23:51:25

标签: c malloc global-variables

我正在开发一个需要malloc一些数据的项目。我试图通过改变我使用的主要结构值来减少程序的堆峰值。我正在使用链表。我的结构就像:

struct myS{

int a,b;
float a,b;
struct myS *next;

};

我在考虑不使用mallocing结构指针而是将其存储在全局数组中,因为我没有太多数据。我该怎么做?

2 个答案:

答案 0 :(得分:1)

如果你有你需要的元素数量的上限,你可以创建一个全局数组 [未动态分配],让它为struct myS heap[]和一个整数idx,已初始化为0。分配元素后,您需要增加idx,并将此元素附加到请求者。

注意 - 只有在您不希望删除元素时才是一个很好的解决方案 [或者您可以承担仅分配每个元素一次]。
如果你确实需要删除,你需要分配一个额外的数组,告诉你当前正在使用哪些元素,使idx循环[增加idx = (idx + 1) % size],并检查每个元素在给出之前分配,但正如我所说 - 它可能会耗费更多时间!

代码快照[不支持删除]:

struct myS heap[SIZE];
int idx = 0;

...

struct myS* allocate() {
  return &(heap[idx++]);
}

注意:上面的代码快照很危险 - 如果您尝试分配更多元素,那么它可能会溢出SIZE

答案 1 :(得分:0)

你可以这样做:

struct myS myArray[ARRAY_SIZE];

/* ... */

struct myS *head = &myArray[0];

head->next = &myArray[1];
head->next->next = &myArray[2];

/* etc... */

使用的数组索引不必是顺序的,例如head可以是索引3head->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 */