Как работает malloc для стека? Куда переменные должны быть соответственно помещены? - PullRequest
0 голосов
/ 03 февраля 2012

Я работаю в операционной системе и пытаюсь выяснить, как работает malloc для стека.Когда пользователь вызывает malloc, возвращается ли указатель из malloc вверху стека и после заданного пробела или внизу заданного пробела?

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

Спасибо.

Ответы [ 4 ]

3 голосов
/ 03 февраля 2012

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

Если вы выделяете в стеке и оставляете свой текущий кадр стека (то есть вы возвращаетесь из функции), тогда предыдущий стеквыделенный материал может (в большинстве случаев: will) быть перезаписан позднее вызовом другой функции.Так что это явно не место для «длительного» хранения.Для данных, которые должны жить дольше, чем вызов функции, вам нужно выделить из кучи.Вот что делает malloc.

То, как malloc выполняет свою работу, зависит от доступных функций ОС и реализации.См. Вопрос: Как работают malloc () и free ()? .

2 голосов
/ 03 февраля 2012

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

0 голосов
/ 03 февраля 2012

Обычно у нас есть этот случай:

.data | .bss | heap ->   ||    <- stack     

У нас есть сначала ненулевые инициализированные (раздел .data) статические объекты и нулевые инициализированные (раздел .bss) статические объекты, затем куча (выделенные объекты malloc) и затем стек (автоматические объекты). Стек растет вниз, а куча растет вверх. (Стек обычно растет вниз, но в некоторых системах он растет вверх.)

Обратите внимание, что для C не требуется стек.

0 голосов
/ 03 февраля 2012

Возвращенный указатель содержит адрес начала выделенной памяти на HEAP.памяти malloc'd не в стеке.Если память используется как массив, вы должны нажать с самого начала - оператор [] в массиве - это просто смещение от начального указателя.

...