return copy; /* при ошибке возвращает NULL */}С появлением стандарта POSIX 2001 программисты по всему миру могут вздохнуть свободнее: эта функция является теперь частью POSIX в виде расширения XSI:
#include <string.h> /* XSI */char *strdup(const char *str); /* Копировать str */Возвращаемое значение равно
NULLstrfree()3.2.3. Системные вызовы:
brk()sbrk()Четыре функции, которые мы рассмотрели (
malloc()calloc()realloc()free()На Unix-системах стандартные функции реализованы поверх двух дополнительных, очень примитивных процедур, которые непосредственно изменяют размер адресного пространства процесса. Мы представляем их здесь, чтобы помочь вам понять, как работают GNU/Linux и Unix (снова «под капотом»); крайне маловероятно, что вам когда-нибудь понадобится использовать эти функции в обычных программах. Они определены следующим образом:
#include <unistd.h> /* Обычный */#include <malloc.h> /* Необходим для систем GLIBC 2 */int brk(void *end_data_segment);void *sbrk(ptrdiff_t increment);Системный вызов
brk()Функцию
sbrk()char *p = (char*)sbrk(0); /* получить текущий конец адресного пространства */if (brk(p + 32) < 0) { /* обработать ошибку */}/* в противном случае, изменение сработало */Практически, вам не нужно непосредственно использовать
brk()sbrk()Еще более практично вообще никогда не использовать эти процедуры. Программа, которая их использует, не может затем использовать также и
malloc()malloc()brk()sbrk()Но знать о низкоуровневых механизмах стоит, и конечно же, набор функций
malloc()sbrk()brk()3.2.4. Вызовы ленивых программистов:
alloca()«Опасность, Билл Робинсон! Опасность!»
Есть еще одна дополнительная функция выделения памяти, о которой вам нужно знать. Мы обсуждаем ее лишь для того, чтобы вы поняли ее, когда увидите, но не следует использовать ее в новых программах! Эта функция называется
alloca()/* Заголовок в GNU/Linux, возможно, не на всех Unix-системах */#include <alloca.h> /* Обычный */void *alloca(size_t size);Функция
alloca()sizeНа первый взгляд,
alloca()• Функция не является стандартной; она не включена ни в какой стандарт, ни в ISO, ни в С или POSIX.
• Функция не переносима. Хотя она существует на многих системах Unix и GNU/Linux, она не существует на не-Unix системах. Это проблема, поскольку код часто должен быть многоплатформенным, выходя за пределы просто Linux и Unix.
• На некоторых системах
alloca()• Цитируя справку [45] (добавлено выделение): «Функция
alloca• Снова цитируя справку: «На многих системах
allocaalloca• Она потворствует неряшливому программированию. Тщательная и корректная работа с памятью не сложна; вам просто нужно подумать о том, что вы делаете, и планировать заранее.
GCC обычно использует встроенную версию функции, которая действует с использованием внутритекстового (inline) кода. В результате есть другие последствия
alloca()Факт, что код является внутритекстовым (inline), означает, что невозможно получить адрес этой функции или изменить ее поведение путем компоновки с другой библиотекой.
Внутритекстовый код часто состоит из одной инструкции, подгоняющей указатель стека, и не проверяет переполнение стека. Поэтому нет возврата
NULL