Системный вызов brk()
Функцию sbrk()
char *p = (char*)sbrk(0); /* получить текущий конец адресного
пространства */
if (brk(p + 32) < 0) {
/* обработать ошибку */
}
/* в противном случае, изменение сработало */
Практически, вам не нужно непосредственно использовать brk()
sbrk() для увеличения (или даже сокращения) адресного пространства. (Вскоре мы покажем, как это делать, в разделе 3.2.5. «Исследование адресного пространства».)Еще более практично вообще
malloc(), и это создает большую проблему, поскольку многие элементы стандартной библиотеки полагаются на использование malloc(). Поэтому использование brk() или sbrk() может приводить к трудно обнаруживаемым крушениям программы.Но знать о низкоуровневых механизмах стоит, и конечно же, набор функций malloc()
sbrk() и brk().3.2.4. Вызовы ленивых программистов: alloca()
«Опасность, Билл Робинсон! Опасность!»
Есть еще одна дополнительная функция выделения памяти, о которой вам нужно знать. Мы обсуждаем ее лишь для того, чтобы вы поняли ее, когда увидите, но не следует использовать ее в новых программах! Эта функция называется alloca()
/* Заголовок в GNU/Linux, возможно, не на всех Unix-системах */
#include
void *alloca(size_t size);
Функция alloca()
size байтов из На первый взгляд, alloca()
• Функция не является стандартной; она не включена ни в какой стандарт, ни в ISO, ни в С или POSIX.
• Функция не переносима. Хотя она существует на многих системах Unix и GNU/Linux, она не существует на не-Unix системах. Это проблема, поскольку код часто должен быть многоплатформенным, выходя за пределы просто Linux и Unix.
• На некоторых системах alloca()
• Цитируя справку[45]
(добавлено выделение): «Функцияalloca зависит от машины и от компилятора. • Снова цитируя справку: «На многих системах alloca
alloca память оказалась бы в середине стека в пространстве для аргументов функции».• Она потворствует неряшливому программированию. Тщательная и корректная работа с памятью не сложна; вам просто нужно подумать о том, что вы делаете, и планировать заранее.
GCC обычно использует встроенную версию функции, которая действует с использованием внутритекстового (inline) кода. В результате есть другие последствия alloca()
Факт, что код является внутритекстовым (inline), означает, что невозможно получить адрес этой функции или изменить ее поведение путем компоновки с другой библиотекой.
Внутритекстовый код часто состоит из одной инструкции, подгоняющей указатель стека, и не проверяет переполнение стека. Поэтому нет возврата NULL