Как я могу получить доступ к памяти кучи помимо использования malloc? - PullRequest
4 голосов
/ 03 сентября 2010

Есть ли способ, которым вы можете выделить память из кучи без вызова malloc? Может ли следующий вызов быть действительным для него?

void* loc = (void*) &heap[end_of_heap];

Ответы [ 5 ]

7 голосов
/ 03 сентября 2010

Нет. Сам язык Си не предоставляет такой функциональности. Если вас интересуют только системы Unix, соответствующие устаревшей функции старой версии стандарта Unix (SUSv2 или более ранней, если я правильно помню), функции brk и sbrk предоставляют эту функцию. Но вам действительно не следует использовать его, если вы не пишете код очень низкого уровня, который никогда не должен быть переносимым.

6 голосов
/ 03 сентября 2010

Помимо malloc и друзей нет переносимого способа, но если вы хотите получить платформу sbrk brk) в старомодном Unix (не в текущем Posix), используйте быть основными системными вызовами. Теперь на их странице написано

Избегайте использования brk () и sbrk (): Malloc (3) пакет выделения памяти портативный и удобный способ выделения памяти.

и этот совет, безусловно, хорош (нет реального преимущества в использовании устаревших системных вызовов даже на платформах, которые их поставляют). mmap из некоторых /dev/ - это совершенно другой способ для некоторых современных версий Unix, для этой цели Windows имеет свои совершенно разные «вызовы win32 API» и т. Д.

3 голосов
/ 03 сентября 2010

Нет способа получить указатель на новую и действительную память кучи, кроме как с помощью функции выделения кучи. Вы не можете просто добавить указатель в кучу в конце существующего указателя и ожидать, что надежно получит к нему доступ.

2 голосов
/ 03 сентября 2010

Вы не можете получить доступ к куче надежно без malloc, но есть альтернативы для выделения памяти.

Если вы пытаетесь получить более точный контроль над распределением памяти, вы можете использовать другие менеджеры памяти, такие как bget memory allocator . Здесь вы берете огромный кусок кучи (ожидаемый максимальный объем памяти + некоторые накладные расходы), используя malloc, и передаете его bget, используя bpool. С этого момента, звоните bget вместо malloc, чтобы выделить память, и brel, чтобы освободить ее. bget, как сообщается, лучше во избежании фрагментации памяти.

2 голосов
/ 03 сентября 2010

Стандарт ничего не говорит о куче (ищите, если не верите). Реализация даже не требуется иметь кучу (как мы обычно это знаем).

Тем не менее, краткий ответ на ваш вопрос - нет в стандарте C. Если, конечно, вы не используете API для конкретной платформы. Как правило, API-интерфейсы ОС иногда дают вам некоторую свободу доступа к памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...