C function pointer casting to void pointer

Я пытаюсь запустить следующую программу, но получаю странные ошибки:

Файл 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 () дает сбой на 64- Bit suse linux при компиляции с gcc. Но он успешно вызывает gfnPtr () VC6 и SunOS.

Но если я изменю функцию, как указано ниже, она будет работать успешно.

void setCallback(const void *fnPointer)
{
    int i; // put any statement here
    gfnPtr = *((FN_GET_VAL*) (&fnPointer));
}

Помогите, пожалуйста, с причиной проблемы. Спасибо.

20
задан demongolem 30 June 2011 в 21:53
поделиться