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

标签 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() 一个全局变量数组来保存列表和节点。

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

这是我所拥有的:

列表.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__

列表加法器

#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)
{

}

最佳答案

There is no init() function, and I don't know how I can malloc() a global variable array which will hold the Lists and Nodes.

C 不允许实际函数之外的可执行代码。

所以这段代码不会编译:

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

鉴于您的问题陈述:

I am supposed to statically declare 2 blocks of memory for lists and nodes of sizes minList and minNodes.

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

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();
      .
      .
      .
}

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

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

关于c - 初始化静态大小的全局 malloc(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52483783/

相关文章:

c - 双链表、MergeSort,得到未定义和不可靠的结果

java - 在预先排序的链表中插入一个节点

.net - 为什么以及在哪里使用 WCF

c - 边界检查字符串指针以获取 C 函数中的返回值

c - 如何处理bool返回类型?

alignment - malloc 与 posix_memalign

c - 使用 Visual Studio 确定堆栈空间

c - c 中的 10k x 10k 矩阵 malloc 好奇心

c - (char*)malloc(sizeof(char)) 导致段错误,怎么办?

java - DoublyLinkedList(普林斯顿版)删除方法如何工作?