2012-12-25 148 views
0

我試圖調用一個函數hfun使用指針指向結構內部的函數。調用函數指針

這些類型定義:

typedef struct Table* TableP; 
typedef struct Object* ObjectP; 
typedef int(*HashFcn)(const void *key, size_t tableSize); 
typedef struct Object { 
    void *key; 
    ObjectLink *top; 
} Object; 

typedef struct Table{ 
    ObjectLink *linkedObjects; 
    size_t size, originalSize; 
    HashFcn hfun; 
    PrintFcn pfun; 
    ComparisonFcn fcomp; 
} Table; 

在這裏,我試圖撥打電話,但得到我想要訪問的地方了內存的錯誤:

Boolean InsertObject(TableP table, ObjectP object) 
{ 

    int i = (*table->hfun)(object->key, table->size); 
    if (table->linkedObjects[i].key == NULL) 
    { 
     table->linkedObjects[i].key = object; 
    } else 
    { 
     table->linkedObjects[i].next->key = object; 
    } 

    return TRUE; 
} 

使用Eclipse調試器我可以看出,在調用點的變量值是:

object->key類型void*0x804c018
table->sizesize_t價值1

我想這是不是調用指向函數的方式。這裏有什麼問題?

編輯:

在調試我還可以看到: *table->hfunint(const void *,size_t) table->hfunHashFcn0x11

+0

發表編譯的例子,顯示問題。例如,你不會顯示'hfun'成員是如何初始化的 - 問題可能僅僅是它不是。 –

+0

offhand,其中'linkedObjects'曾經分配過?你是'InsertObject'的確,那個數組中有空格,但沒有更多的代碼,人們只能猜測它是否引用了有效的數據。 – WhozCraig

回答

6

你不調用它的正確途徑。

您可以像訪問其他函數一樣訪問函數指針。

table->hfun(object->key, table->size) 

[編輯]右鍵,請確保您還指定hfun正確:

int myFunc(const void* key, size_t tableSize) { } 

table->hfun = &myFunc; 
+0

再次,我得到'沒有來源可用於「0x11」' – Tom

+3

然而,使用'(*表 - > hfun)(對象 - >鍵,表 - >大小)沒有任何錯誤,所以這不是'這很可能是解決問題的方法。 –

+0

更新了我的答案,並附加了一些關於函數指針的信息。 –