У меня есть эта функция, которая будет выделять определенное количество байтов и отправлять обратно, только если она доступна, а размер запрошенного количества байтов соответствует моей небольшой управляемой памяти. Мой вопрос:
Соответствующая структура данных не выделяется, и я боюсь, что не верну правильные адреса. Кто-нибудь знает, как я могу проверить эту функцию, используя ее как библиотеку в другой программе?
СТРУКТУРА ДАННЫХ
typedef struct memBlock{
struct memBlock* next;
unsigned long size; // Size of this block
unsigned int is_used; // bool 0 = not used 1 = used
} memBlock;
ФУНКЦИЯ MALLOC:
char *mm_alloc(unsigned long no_of_chars){
if (!has_initialized) {
printf("No Memory has been intialized, PLEASE INITIALIZE THE MEMORY BEFORE calling This function\n");
exit(1);
}
void *cur_location; // this is where we are currentl in our memory pool
memBlock *current_loc_mb; // the current mem block location
char *mem_location; // mem location we will return to the user
/* We are going to have to include the size of our data struct when we are searching for open memory*/
no_of_chars = no_of_chars + sizeof(struct memBlock);
mem_location = 0; // set to 0 until a proper size has been found
cur_location = managed_memory_start; // start at the beginning of our allocated memory
// go until there is no more memory left, allocate until we get to the end of our managed memory
while (managed_memory_start != NULL) {
/*cur_location and cur_loc_mcb are at the same address initially,
but we use the current location as a pointer to move around our managed memory*/
cur_loc_mcb = (memBlock *)cur_location;
// if our current location is not used
if (!cur_loc_mcb->is_used) {
if (cur_loc_mcb->size >= no_of_chars) {
// we have found a size big enough or equal to what the user asks for
cur_loc_mcb->is_used = 1;
mem_location = cur_location;
break;
}
}
// at this point we dont have a size big enough, move to the next one
cur_location = cur_location + cur_loc_mcb->size;
}
/*Move the memory past or MCB and return*/
mem_location = mem_location + sizeof(struct memBlock);
return mem_location;
}
1 ответ
Где-то в вашем коде вы установили mem_location
mem_location = cur_location;
А позже, непосредственно перед возвратом его значения, вы меняете его
mem_location = mem_location + sizeof(struct memBlock);
Это не кажется правильным...
cur_location = cur_location + cur_loc_mcb->size;
, пока не найдет достаточно большое свободное место. Затем он просто проходит мимо метаданных, чтобы получить указатель на свободное пространство, в которое программист может писать. Но да, нет смысла менять его дважды.
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
C
? Приведение (cur_loc_mcb = (memBlock *)cur_location;
) является ложным и должно быть оставлено на усмотрение компилятора.