初始化静态大小的全局malloc()

时间:2018-09-24 16:36:32

标签: c malloc doubly-linked-list

我的代码有问题。我应该有4个文件。 list.h,listAdders.c,listMovers.c和listRemovers.c。

我应该为minList和minNodes大小的列表和节点静态声明2个内存块。而且Malloc()仅允许在运行时使用(这意味着我不按每个列表或每个节点分配内存)。

listRemovers.c和listMovers.c将需要访问我使用malloc()为列表和节点分配的内存块。

没有init()函数,我不知道如何malloc()一个全局变量数组,该数组将保存列表和节点。

以防万一我的问题不清楚。如何为列表和节点的结构分配初始的内存块?这样,当我创建列表或添加节点时,它们就会存储在我分配的内存中。

这就是我所拥有的:

list.h

#ifndef __LIST__
#define __LIST__

#define MIN_LISTS 3
#define MIN_NODES 30

typedef struct NODE{
    struct NODE* next;
    struct NODE* prev;
} NODE;

typedef struct LIST{
    struct NODE* head;
    struct NODE* cursor;
    int size;
} LIST;

extern NODE *node_block;
extern LIST *list_block;

LIST *ListCreate();

int ListAdd(LIST *list, void* item); 

#endif // __LIST__

listAdders.c

#include "list.h"
#include <stdlib.h>
#include <stdio.h>

NODE *node_block = malloc(MIN_NODES * sizeof(struct NODE));
LIST *list_block = malloc(MIN_LISTS * sizeof(struct LIST));

LIST *ListCreate()
{

}

int ListAdd(LIST * list, void* item)
{

}

1 个答案:

答案 0 :(得分:2)

  

没有init()函数,而且我不知道如何malloc()一个全局变量数组,该数组将保存列表和节点。

C不允许实际功能之外的可执行代码。

因此此代码将无法编译:

NODE *node_block = malloc(MIN_NODES * sizeof(struct NODE));
LIST *list_block = malloc(MIN_LISTS * sizeof(struct LIST));

给出您的问题说明:

  

我应该为minList和minNodes大小的列表和节点静态声明2个内存块。

用上面的代码替换上面的代码将是一个“静态声明”:

NODE node_block[ MIN_NODES ];
LIST list_block[ MIN_LIST ];

您还可以执行以下操作:

NODE *node_block;
LIST *list_block;

static void init_memory()
{
    node_block = malloc(MIN_NODES * sizeof( *node_block ));
    list_block = malloc(MIN_LISTS * sizeof( *list_block ));
}

int main( int argc, char **argv )
{
    init_memory();
      .
      .
      .
}

请注意,如果您需要的节点和/或列表比开始时要多,那么从固定数量的已分配节点和列表开始将导致不必要的复杂代码。

要么静态分配所有内存,要么动态分配所有内存。这样,您的代码就会简单得多。