Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
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