Что делает этот код C? - PullRequest
0 голосов
/ 18 ноября 2010

Мне нужно знать вывод следующей функции c

bool GC_search_memaddr (void* high_add, void* low_add, void* search_add)
{
    void ** gc_ptr_to_ptr;
    void * gc_temp;
    gc_temp = high_add;
    while( gc_temp > low_add )
    { 
        gc_temp = gc_temp - 1;
        gc_ptr_to_ptr = (void**)gc_temp;
        if ((*gc_ptr_to_ptr) == search_add)
            return True;
    }
    return False;
}

При этом все 3 функции ввода являются указателями.Я думал, что это была просто функция поиска, основанная на инкрементах, но проблема в том, что если вы измените все из них на int, выходные данные функции иногда изменятся.Кто-нибудь может рассказать, что именно здесь происходит ...

Ответы [ 4 ]

3 голосов
/ 18 ноября 2010

Арифметика указателя, скорее всего, ваша проблема.Строка:

gc_temp = gc_temp - 1;

изменит значение gc_temp в зависимости от того, что ваш компилятор решит sizeof(void).Если вы измените параметры и локальные переменные на int, они будут повторяться ровно 1.Выключите ваш отладчик и посмотрите, что происходит.

2 голосов
/ 18 ноября 2010

Переменные low_add и high_add содержат начальный и конечный адреса области памяти. Функция ищет в этой области памяти указатель, содержащий то же значение, что и в search_add. Из названия функции я предполагаю, что это часть какого-то сборщика мусора.

1 голос
/ 18 ноября 2010

Как говорит blastfurnace, он выполняет поиск байтов для заданного значения указателя.Эквивалент int будет иметь вид:

bool GC_search_memaddr (void* high_add, void* low_add, int search_add)
{
    int * gc_ptr_to_int;
    void * gc_temp;
    gc_temp = high_add;
    while( gc_temp > low_add )
    { 
        gc_temp = gc_temp - 1;
        gc_ptr_to_int = (int *)gc_temp;
        if ((*gc_ptr_to_int) == search_add)
            return True;
    }
    return False;
}

Хотя gc_temp на самом деле должен иметь тип char *, и он должен использовать memcpy() для учета проблем с порядком байтов, поэтому он должен выглядетькак:

bool GC_search_memaddr (void* high_add, void* low_add, void *search_add)
{
    void *gc_ptr;
    char *gc_temp = high_add;

    while (gc_temp > low_add)
    { 
        gc_temp--;
        memcpy(&gc_ptr, gc_temp, sizeof gc_ptr);
        if (gc_ptr == search_add)
            return True;
    }
    return False;
}
0 голосов
/ 18 ноября 2010

Функция, кажется, определяет, находится ли адрес search_add между адресами high_add и low_add.Почему это не сделано с вычитанием указателя и почему уродливое приведение к void** просто для разыменования его в следующем возможном случае, мне не под силу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...