Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Если вы повторите попытку, но не будете использовать библиотеку GNU С, вы обнаружите, что безадресное чтение не разрешено. Далее приведена программа memory5b.c:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main() {
char z = *(const char *)0;
printf("I read from location zeron");
exit(EXIT_SUCCESS);
}
Вы получите следующий результат:
$ <b>./memory5b</b>
Segmentation fault
В этот раз вы пытаетесь прочесть непосредственно из нулевого адреса. Между вами и ядром теперь нет GNU-библиотеки libc, и программа прекращает выполнение. Имейте в виду, что некоторые системы UNIX разрешают читать из нулевого адреса, ОС Linux этого не допускает.
Освобождение памяти
До сих пор мы выделяли память и затем надеялись на то, что по завершении программы использованная нами память не будет потеряна, К счастью, система управления памятью в ОС Linux вполне способна с высокой степенью надежности гарантировать возврат памяти в систему по завершении программы. Но большинство программ просто не хотят распределять память, используют ее очень короткий промежуток времени и затем завершаются. Гораздо более распространено динамическое использование памяти по мере необходимости.
Программы, применяющие память на динамической основе, должны всегда возвращать неиспользованную память диспетчеру распределения памяти
malloc
free
malloc
<b>#include <stdlib.h></b>
<b>void free(void *ptr_to_memory);</b>
Вызов
free
malloc
calloc
realloc
calloc
realloc
Эта программа называется memory6.c.
#include <stdlib.h>
#include <stdio.h>
#define ONE_K (1024)
int main() {
char *some_memory;
int exit code = EXIT_FAILURE;
some_memory = (char*)malloc(ONE_K);
if (some_memory != NULL) {
free(some_memory);
printf("Memory allocated and freed againn");
exit_code = EXIT_SUCCESS;
}
exit(exit_code);
}
Вывод программы следующий:
$ <b>./memory6</b>
Memory allocated and freed again
Как это работает
Эта программа просто показывает, как вызвать функцию
free
Помните о том, что после вызова
free
malloc
free
Другие функции распределения памяти
Две другие функции распределения или выделения памяти
calloc
realloc
malloc
free
Далее приведены их прототипы:
<b>#include <stdlib.h></b>
<b>void *calloc(size_t number_of_elements, size_t element_size);</b>
<b>void *realloc(void *existing_memozy, size_t new_size);</b>
Несмотря на то, что функция
calloc
free
malloc
calloc
malloc
calloc
Функция
realloc
malloc
calloc
realloc
realloc
realloc