У меня есть эта функция, которая будет выделять определенное количество байтов и отправлять обратно, только если она доступна, а размер запрошенного количества байтов соответствует моей небольшой управляемой памяти. Мой вопрос:

Соответствующая структура данных не выделяется, и я боюсь, что не верну правильные адреса. Кто-нибудь знает, как я могу проверить эту функцию, используя ее как библиотеку в другой программе?

СТРУКТУРА ДАННЫХ

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;
}
0
Warz 14 Мар 2011 в 02:40
«Кто-нибудь знает, как я могу протестировать эту функцию, используя ее как библиотеку в другой программе?» Это будет означать, что у вас есть набор тестов и для другой программы. В противном случае, как вы узнаете, что хорошо освещаете их функциональные возможности и, следовательно, ваши функциональные возможности? Может быть, лучше автоматизировать тесты для вашей собственной библиотеки malloc, потому что тогда вы можете гарантировать охват крайних случаев. Если у вас уже есть это, то то, о чем вы спрашивали в этом вопросе, может быть хорошим вторым шагом.
 – 
Merlyn Morgan-Graham
14 Мар 2011 в 03:02
1
Вы компилируете как C? Приведение (cur_loc_mcb = (memBlock *)cur_location;) является ложным и должно быть оставлено на усмотрение компилятора.
 – 
pmg
14 Мар 2011 в 03:36
@ Мерлин Морган-Грэм, я ищу некоторые идеи для тестовых примеров для этих функций, которые я сейчас пишу.
 – 
Warz
14 Мар 2011 в 06:27
Невозможно определить, запрашиваете ли вы больше памяти, чем доступно в самом большом блоке. Если вы это сделаете, вы никогда не покинете цикл while (то есть до тех пор, пока программа не выйдет из строя)
 – 
pmg
14 Мар 2011 в 12:40
Поэтому while(mem_start !=null) будет работать вечно, даже если я тщательно пройдусь по всему блоку. как еще я могу просмотреть свой кусок памяти, пока у меня ничего не осталось
 – 
Warz
14 Мар 2011 в 21:16

1 ответ

Где-то в вашем коде вы установили mem_location

            mem_location = cur_location;

А позже, непосредственно перед возвратом его значения, вы меняете его

    mem_location = mem_location + sizeof(struct memBlock);

Это не кажется правильным...

0
pmg 14 Мар 2011 в 03:36
Похоже, у него есть метаданные распределения, встроенные в доступную память, непосредственно предшествующие каждому из выделенных блоков и свободных блоков. Он проходит через записи метаданных с помощью cur_location = cur_location + cur_loc_mcb->size;, пока не найдет достаточно большое свободное место. Затем он просто проходит мимо метаданных, чтобы получить указатель на свободное пространство, в которое программист может писать. Но да, нет смысла менять его дважды.
 – 
Null Set
14 Мар 2011 в 04:15
Я делаю именно то, о чем говорит Null Set. Mem_location = mem_location просто выравнивает его, прежде чем я отправлю пользователю обратно выделенное пространство
 – 
Warz
14 Мар 2011 в 06:26