Выделение правильного размера памяти

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

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

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

РЕДАКТИРОВАТЬ:

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


person mrswmmr    schedule 13.02.2012    source источник
comment
Не могли бы вы пояснить, почему вы добавляете сюда sizeof(void*)? Что вы собираетесь делать с этим воспоминанием? Кроме того, есть ли причина, по которой вы не используете здесь plain-ol 'malloc?   -  person templatetypedef    schedule 14.02.2012
comment
Краткий ответ: либо вы знаете, что делаете, и вам не нужно задавать этот вопрос, либо вы не знаете, что делаете, и вам не следует использовать sbrk(), а лучше malloc().   -  person Kerrek SB    schedule 14.02.2012
comment
Я избегаю malloc, потому что я экспериментирую с некоторыми системными вызовами (такими как sbrk ()), и я пытаюсь сохранить указатель любого типа и целое число без знака в этом блоке памяти, который я добавил в кучу.   -  person mrswmmr    schedule 14.02.2012
comment
Для ясности: оператор sizeof возвращает размер в байтах. Я не понимаю, о чем вы спрашиваете. Вы пробовали распечатать полученный размер, чтобы проверить, соответствует ли он вашим ожиданиям?   -  person jweyrich    schedule 14.02.2012
comment
Я верю, что вы знаете, что делаете, и понимаете, что использование этого вместо malloc ухудшит производительность вашей программы.   -  person David Heffernan    schedule 14.02.2012


Ответы (2)


Передайте количество байтов в качестве аргумента 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 пользовательской функции.

person ouah    schedule 13.02.2012
comment
так что sbrk будет принимать свои аргументы только в байтах? Кажется, я помню, что тип выделяемой вами памяти влияет на размер sbrk или malloc. - person mrswmmr; 14.02.2012
comment
@mrswmmr функция Linux sbrk и стандартная функция malloc принимают количество байтов в качестве своих операндов, - person ouah; 14.02.2012

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

person ugoren    schedule 13.02.2012