我試圖運行下面的程序,但得到一些奇怪的錯誤:C函數指針鑄造空指針
文件1.C:
typedef unsigned long (*FN_GET_VAL)(void);
FN_GET_VAL gfnPtr;
void setCallback(const void *fnPointer)
{
gfnPtr = *((FN_GET_VAL*) (&fnPointer));
}
文件2.C:
extern FN_GET_VAL gfnPtr;
unsigned long myfunc(void)
{
return 0;
}
main()
{
setCallback((void*)myfunc);
gfnPtr(); /* Crashing as value was not properly
assigned in setCallback function */
}
這裏gfnPtr()在使用gcc編譯時在64位suse linux上崩潰。但它成功地調用了gfnPtr()VC6和SunOS。
但是,如果我改變了下面給出的功能,它工作正常。
void setCallback(const void *fnPointer)
{
int i; // put any statement here
gfnPtr = *((FN_GET_VAL*) (&fnPointer));
}
請幫助解決問題的原因。謝謝。
感謝您的答覆。我會小心不要混合數據和函數指針。但在這種情況下,我無法弄清楚發生這種情況的原因。如果我用-m32(32位)編譯並運行,它工作得很好,但是如果我使用-m64(64位)編譯它會給出問題。另外,如果我添加一個像** int i; **這樣的語句,然後它就可以正常工作了。不知道可能堆棧損壞的原因,但如何檢查。 – Manoj 2011-04-07 11:28:49