Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
malloc的全局数组_C_Malloc_Global Variables - Fatal编程技术网

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
可以是index
3
head->next
可以是index
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 */
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
可以是index
3
head->next
可以是index
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 */
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的替代品之类的东西。