2012-02-13 2 views
0

У меня возникла проблема с распределением нужного размера памяти в моей программе. Я делаю следующее:Выделение необходимого объема памяти

void * ptr = sbrk(sizeof(void *)+sizeof(unsigned int)); 

Когда я делаю это, я думаю, что это добавляет слишком много памяти в куче, потому что выделяет его в единицах аннулируются * вместо байтов. Как я могу сказать, что хочу sizeof (независимо от), чтобы обозначить независимо от того, байт вместо что угодно другие единицы?

EDIT:

Я видел другие люди бросили вещи как полукокса, так что компилятор имеет размер в байтах. Если sizeof (unsigned int) - 4 байта, но тип, который я использовал, равен void *, будет ли компилятор в 4 раза меньше размера void * вместо 4 байтов?

+0

Можете ли вы пояснить, почему вы добавляете 'sizeof (void *)' здесь? Что вы планируете делать с этой памятью? Кроме того, любая причина, по которой вы не используете plain-ol '' malloc' здесь? – templatetypedef

+5

Короткий ответ: либо вы знаете, что делаете, и вам не нужно задавать этот вопрос, либо вы не знаете, что делаете, и вы не должны использовать 'sbrk()', а скорее 'таНос()'. –

+0

Я избегаю malloc, потому что я экспериментирую с некоторыми системными вызовами (например, sbrk()), и я пытаюсь сохранить указатель любого типа и целое число без знака в этом блоке памяти, которое я добавил в кучу – mrswmmr

ответ

0

Передайте количество байтов в качестве аргумента sbrk.

В Linux прототип sbrk является:

void *sbrk(intptr_t increment); 

http://www.kernel.org/doc/man-pages/online/pages/man2/brk.2.html

sbrk() увеличивает пространство данных программы по приращений байтов.

Но, как некоторые люди в комментариях добавил, если вы хотите, чтобы динамически выделять память вы ищете функции malloc и не sbrk. brk и sbrk - это системные вызовы, которые обычно используются внутренне для реализации функции пользователя malloc.

+0

, поэтому sbrk будет принимать аргументы только в байтах? Кажется, я помню, что тип любой распределяемой памяти влияет на размер sbrk или malloc – mrswmmr

+0

@mrswmmr, а функция 'sbrk' Linux и стандартная функция' malloc' принимают количество байтов в качестве их операнда, – ouah

0

Ядро управляет памятью процесса в гранулярности страницы. Это означает, что адресное пространство процесса должно расти (или сокращаться) целым числом страниц.
Таким образом, хотя sbrk получает несколько байтов, он добавит по крайней мере одну страницу к процессу.

Смежные вопросы