Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
table =
(struct table*)malloc(count * sizeof(struct table));
...
/* заполнить таблицу */
...
table[i].i = j; /* Обновить член i-го элемента */
...
if (/* некоторое условие */) {
/* нужно увеличить таблицу */
count += count/2;
p =
(struct table*)realloc(table, count * sizeof(struct table));
table = p;
}
table[i].i = j; /* ПРОБЛЕМА 1 устраняется */
other_routine();
/* Рекурсивный вызов, модифицирует таблицу */
table[i].j = k; /* ПРОБЛЕМА 2 также устраняется */
Использование индексирования не решает проблему, если вы используете глобальную копию первоначального указателя на выделенные данные; в этом случае, вам все равно нужно побеспокоиться об обновлении своих глобальных структур после вызова
realloc()
ЗАМЕЧАНИЕ. Как и в случае с
malloc()
realloc()
memset()
realloc()
3.2.1.5. Выделение с инициализацией нулями:
calloc()
Функция
calloc()
malloc()
coordinates = (struct coord*)calloc(count, sizeof(struct coord));
По крайней мере идейно, код
calloc()
void *calloc(size_t nmemb, size_t size) {
void *p;
size_t total;
total = nmemb * size; /* Вычислить размер */
p = malloc(total); /* Выделить память */
if (p != NULL) /* Если это сработало - */
memset(p, ' ', total); /* Заполнить ее нулями */
return p; /* Возвращаемое значение NULL или указатель */
}
Многие опытные программисты предпочитают использовать
calloc()
Если вы знаете, что вам понадобится инициализированная нулями память, следует также использовать
calloc()
malloc()
calloc()
memset()
3.2.1.6. Подведение итогов из GNU Coding Standards
Чтобы подвести итоги, процитируем, что говорит об использовании процедур выделения памяти GNU Coding Standards:
Проверяйте каждый вызов
malloc
realloc
realloc
realloc
В Unix
realloc
realloc
malloc
Вы должны считать, что
free
free
В этих трех коротких абзацах Ричард Столмен (Richard Stallman) выразил суть важных принципов управления динамической памятью с помощью
malloc()
Мы хотим подчеркнуть, что стандарт С требует, чтобы
realloc()
NULL
3.2.1.7. Использование персональных программ распределения
Набор функций с
malloc()
malloc()
Вы можете написать персональную программу распределения — набор функций или макросов, которые выделяют большие участки памяти с помощью
malloc()
Например, GNU awk (gawk) использует эту методику. Выдержка из файла
awk.h
gawk
#define getnode(n) if (nextfree) n = nextfree,
nextfree = nextfree->nextp; else n = more_nodes()
#define freenode(n) ((n)->flags = 0, (n)->exec_count = 0,
(n)->nextp = nextfree, nextfree = (n))
Переменная
nextfree
getnode()
more_nodes()
NODE
freenode()
NODE