инициализация глобального malloc () статического размера - PullRequest
0 голосов
/ 24 сентября 2018

У меня проблемы с моим кодом.У меня должно быть 4 файла.list.h, listAdders.c, listMovers.c и listRemovers.c.

Я должен статически объявить 2 блока памяти для списков и узлов размеров minList и minNodes.А 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 голосов
/ 24 сентября 2018

Нет функции init (), и я не знаю, как я могу malloc () массив глобальных переменных, который будет содержать списки и узлы.

C неразрешить выполнение исполняемого кода за пределами реальных функций.

Таким образом, этот код не будет компилироваться:

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

Учитывая ваше постановление задачи:

Я должен статически объявить2 блока памяти для списков и узлов размеров minList и 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();
      .
      .
      .
}

Обратите внимание, что запуск с фиксированного количества выделенных узлов и списков приведет к ненужно сложному коду, если вам потребуется больше узлов и / или списков, чем вы начинаете.

Либо статически выделяйте всю свою память, либо динамически выделяйте всю ее.Таким образом, ваш код будет намного проще.

...