Выделение правильного объема памяти - PullRequest
0 голосов
/ 14 февраля 2012

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

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

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

EDIT:

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

Ответы [ 2 ]

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

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

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

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

...