我需要知道以下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,函数的输出有时会改变。 任何人都可以告诉我们到底发生了什么......
答案 0 :(得分:3)
指针算术可能是你的问题。这一行:
gc_temp = gc_temp - 1;
将通过编译器决定gc_temp
的任何内容来更改sizeof(void)
的值。如果您将参数和局部变量更改为int
,它们将完全按1
进行迭代。打破你的调试器,看看发生了什么。
答案 1 :(得分:2)
变量low_add
和high_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)