2017-02-14 4 views
0

У меня есть модульная программа на C, где каждый модуль использует статические глобальные переменные для совместного доступа переменных между функциями модуля, но не к другим модулям. Теперь нужен динамически выделенный массив, который аналогично доступен для всех функций модуля, но я не знаком с malloc. Ниже приведен упрощенный пример того, что я пытаюсь сделать. Это похоже на правильный способ сделать это, но я запутался, потому что я не могу найти подобных примеров (и поскольку реальная вещь намного сложнее). Могу ли я поддерживать статический указатель, подобный этому, и использовать malloc и free для выделения любых блоков памяти, которые приходят и уходят, но сохраняя хороший указатель на текущий блок?C статический указатель для динамического массива

static int *dataBlock = NULL; 
static int dataSize = 0, dataCursor = 0; 

// Init - called externally 
int initData(size) { 
    if (dataBlock || dataSize > 0) { 
     return -1; 
    } 
    dataBlock = malloc(sizeof(*dataBlock) * size); 
    if (!dataBlock) { 
     return -1; 
    } 
    dataSize = size; 
    dataCursor = 0; 
    return 0; 
} 

// Push - called externally 
int pushData(value) { 
    if (dataCursor >= dataSize) { 
     return -1; 
    } 
    dataBlock[dataCursor] = value; 
    dataCursor++; 
    return dataCursor; 
} 

// Free - called externally 
void freeData() { 
    free(dataBlock); 
    dataSize = 0; 
    dataCursor = 0; 
    dataBlock = NULL; 
} 
+0

Вы можете. И если факт, я не понимаю, зачем ограничивать себя конкретным размером данных. Вы можете «перераспределить» блок после исчерпания текущего предела. – StoryTeller

ответ

0

Да, это будет (почти) работа. Если вы будете обращаться к этой структуре с помощью нескольких потоков, она не удастся.

Существует дефект в pushData. Он поместит первый элемент в dataBlock [1]. Предположим, что размер 3:

вызов 1 - блок данных [1] установлен

2 - блок данных [2] установлен

3 - блок данных [3] набор - вне границ.

+0

согласился с дефектом и исправил его (следует ли удалить этот комментарий?). пожалуйста, уточните свой первый пункт о нескольких потоках – robisrob

Смежные вопросы