这个C代码做了什么?

时间:2010-11-17 21:50:51

标签: c

我需要知道以下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 个答案:

答案 0 :(得分:3)

指针算术可能是你的问题。这一行:

gc_temp = gc_temp - 1;

将通过编译器决定gc_temp的任何内容来更改sizeof(void)的值。如果您将参数和局部变量更改为int,它们将完全按1进行迭代。打破你的调试器,看看发生了什么。

答案 1 :(得分:2)

变量low_addhigh_add包含内存区域的起始地址和结束地址。该函数在内存区域中搜索包含search_add中相同值的指针。从函数名称我假设它是一些垃圾收集器的一部分。

答案 2 :(得分:1)

正如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;
}

答案 3 :(得分:0)