2013-02-14 3 views
0

Как мы можем использовать непрерывный блок памяти таким образом, чтобы часть его связывалась с оставшейся частью? Например, если я выделяю смежный блок байтов с помощью malloc, и теперь я хочу структурировать его таким образом, чтобы начальная часть блока была структурирована как указатели, указывающие на оставшуюся часть. Это означает, что указатели и указывающие объекты должны быть смежными ... ??Распределение и структурирование памяти

ответ

0

Вопрос не имеет для меня никакого смысла. Предположим, вы хотели nItems размера sizeBytes (что означает, что они имеют одинаковый размер), вам не нужно будет хранить указатели, потому что вы можете вычислить смещения в выделенной памяти всякий раз, когда вам это нужно. Таким образом, вы, вероятно, упускаете некоторые критерии в своем вопросе. Вот как вы могли бы сделать, что:

void *block = malloc(nItems * sizeBytes); 

Затем, чтобы достичь в n-th объекта, вы бы просто сделать:

void *myMemory = block + n * sizeBytes; 

Вы хотели бы, возможно, сделать некоторые проверки границ там ..

Но это слишком просто, поэтому я предполагаю, что у вас действительно есть структуры разных размеров, которые вы хотите выделить в одном malloc и получить доступ. Таким образом, дело не только в выяснении того, что такое адрес «вспомогательного блока памяти», но вы хотите знать, как его отличать, чтобы впоследствии вы могли понять объект (предполагая, что это структура C) , Поэтому, я думаю, я должен сказать, что я все еще смущен вопросом.

Возможно, вам понадобится что-то вроде указателя, размера и типа структуры, которые, как предполагается, должны быть «подблоком» памяти. Это будет указывать на то, как должна выглядеть ваша информация заголовка. Грубо вам нужно вычислить хранилище, необходимое для ваших «метаданных», а затем «полезных данных» и объединить все эти вещи.

Но это не тривиальная вещь для реализации, потому что вам нужно выяснить, как вы сообщаете своей функции, которая выделяет/инициализирует блок памяти, каким будет сочетание объектов (и последовательность макета каждой подстанции -объект).

Я боюсь, что этот вопрос огорчен.

+0

хорошо да, мои вопросы огорчены в соответствии с указанными. !!вот другая аналогия ... если я выделяю типичный 2D-массив, используя malloc(), я получаю не непрерывные блоки в некоторых блоках, есть указатели на данные в других, есть данные ... Я хочу выделить их все (всеми я имею в виду как указатели, так и данные), чтобы они были непрерывными в памяти. Как я это делаю ??? – CoolToshi45

+0

Если вам нужен 2D-массив одного типа объектов, вы можете сделать это следующим образом: –

0

Если вы хотите 2D массив одного типа объекта, вы можете сделать это следующим образом:

int entries = xSize * ySize;   // create a 2D array of xSize by ySize dimensions 
size_t buffSize = entries * objectSize; // objectSize is number of bytes for your object 
void *block = malloc(buffSize); 

Теперь доступ к любой записи в 2D-массив:

void *thingie = block + y * xSize + x; 

Теперь штучка точки для блокировки, которая соответствует x, y. Если вы захотите, вы также можете изменить макет своего объекта памяти. Выше я сделал рядовой. Вы можете:

void *thing = block + x * ySize + y; 

Это будет колонка майора. Выше может распространяться на п-размеров:

int entries = xSize * ySize * zSize; // create a 3D array of xSize, ySize, zSize dimensions 
size_t buffSize = entries * objectSize; // objectSize is number of bytes for your object 
void *block = malloc(buffSize); 

А потом:

void *thingie = block + z * ySize * xSize + y * xSize + x; 

, чтобы добраться до записи в 3D кубе. Вы можете взять это в любое измерение, которое вы хотите, конечно, вы взорвите свою память раньше, чем позже, если вы имеете дело с большими объектами в больших размерных пространствах.

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