malloc的全局数组
我正在做一个项目,我需要整理一些数据。我试图通过改变我使用的主结构值来降低程序的堆峰值。我使用的是链表。我的结构类似于:malloc的全局数组,c,malloc,global-variables,C,Malloc,Global Variables,我正在做一个项目,我需要整理一些数据。我试图通过改变我使用的主结构值来降低程序的堆峰值。我使用的是链表。我的结构类似于: struct myS{ int a,b; float a,b; struct myS *next; }; 我在想,由于我没有太多的数据,我会将它存储在一个全局数组中,而不是mallock结构指针。我该怎么做?您可以这样做: struct myS myArray[ARRAY_SIZE]; /* ... */ struct myS *head = &myArra
struct myS{
int a,b;
float a,b;
struct myS *next;
};
我在想,由于我没有太多的数据,我会将它存储在一个全局数组中,而不是mallock结构指针。我该怎么做?您可以这样做:
struct myS myArray[ARRAY_SIZE];
/* ... */
struct myS *head = &myArray[0];
head->next = &myArray[1];
head->next->next = &myArray[2];
/* etc... */
所使用的数组索引不必是连续的,例如,head
可以是index3
和head->next
可以是index21
如果要初始化列表以同时使用数组中的所有条目,可以在循环中执行此操作:
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 */
struct myS*node=head;
对于(int i=1;i下一步=&myArray[i];
node=&myArray[i];
}
节点->下一步=NULL;/*确保列表尾部没有“下一步”指针*/
您可以这样做:
struct myS myArray[ARRAY_SIZE];
/* ... */
struct myS *head = &myArray[0];
head->next = &myArray[1];
head->next->next = &myArray[2];
/* etc... */
所使用的数组索引不必是连续的,例如,head
可以是index3
和head->next
可以是index21
如果要初始化列表以同时使用数组中的所有条目,可以在循环中执行此操作:
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 */
struct myS*node=head;
对于(int i=1;i下一步=&myArray[i];
node=&myArray[i];
}
节点->下一步=NULL;/*确保列表尾部没有“下一步”指针*/
如果您有所需元素数量的上限,您可以创建一个全局数组[非动态分配],让它成为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
中的元素更多的元素,那么它可能会溢出如果您有所需元素数量的上限,您可以创建一个全局数组[未动态分配],让它成为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
中的元素更多的元素,则可能会溢出。如果您在数组中保留一个空闲节点列表,最初由整个数组组成,则无需遍历即可找到未分配的节点。@KeithThompson:谢谢,这确实是一个很好的优化!但我相信OP实际上是在简单的版本中只分配一次每个元素,我将编辑并尝试添加您描述的解决方案,如果他给出一个指示,表明这确实是他想要的。如果您在数组中维护一个空闲节点列表,最初由整个数组组成,您不需要遍历就可以找到未分配的节点。@KeithThompson:谢谢,这确实是一个很好的优化!但是我相信OP实际上是在简单的版本中只分配每个元素一次,我会编辑并尝试添加您正在描述的解决方案,如果他能给出一个指示,表明这确实是他想要的。如果您确实没有太多数据,请不要这样做。这听起来像是过早的优化。如果你有大量的数据,不要这样做,但首先要阅读一下malloc的替代品之类的东西。如果你真的没有太多的数据,就不要这样做。这听起来像是过早的优化。如果你有大量的数据,不要这样做,但首先要读一读malloc的替代品之类的东西。