2010-11-17 122 views
0

我需要知道以下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,則函數的輸出有時會發生更改。 有人可以告訴這裏究竟發生了什麼...

+0

它看起來就像是一種非常奇怪的方式來判斷'search_add'是否在'high_add'和'low_add'之間?我不知道...用於什麼功能? – filipe 2010-11-17 21:58:04

回答

2

變量low_addhigh_add包含內存區域的開始和結束地址。該函數在內存區域搜索包含search_add中相同值的指針。從函數名稱我假設它是一些垃圾收集器的一部分。

+1

正確。雖然算術對'void *',這是非標準的;而且它也不能用於加載'void *'值的對齊要求的體系結構。 – caf 2010-11-18 01:43:42

+0

@caf:我沒有說這是一個__good__垃圾回收器。 :) – Blastfurnace 2010-11-18 01:50:50

3

指針算術可能是你的問題。行:

gc_temp = gc_temp - 1; 

會通過改變gc_temp價值無論你的編譯器決定sizeof(void)是。如果將參數和局部變量更改爲int,則它們將精確地迭代1。打破你的調試器,看看發生了什麼。

0

該函數似乎確定地址search_add是否位於地址high_add和low_add之間。爲什麼這不是用指針減法來完成的,爲什麼在下一個可能的場合只有在void**才能解除引用這個醜陋的表演超出了我的想象。

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; 
} 
+0

我喜歡你的修正版本如何避免對齊問題,並且不會假設整數和指針的大小相同。 – Blastfurnace 2010-11-18 02:10:23