Вопрос по c – что означает нулевой указатель на функцию в C?
Скажем, у нас есть указатель на функцию:
<code>void (*func0)(void); </code>
который также определен:
<code>void func0(void) { printf( "0\n" ); } </code>
Но скажем, в какой-то момент мы пытаемся как-то получить доступ к указателю на функцию, тогда, если отладчик MS VS показывает, что func0 фактически указывает на 0x0000, когда я вхожу в код, что это значит? А также, пожалуйста, дайте мне знать, что является лучшим решением? Благодарю.
справление заключается просто в том, чтобы указатель ссылался на соответствующую функцию.
В вашем случае вы хотите что-то вроде этого:
void MyFunction(void)
{
printf( "0\n" );
}
а затем позже вы можете назначитьfunc0
:
func0 = &MyFunction;
Обратите внимание, что я использую другое имя для переменной указателя функции и фактической функции.
И теперь вы можете вызвать функцию через указатель функции:
func0();
naming а такжеdefining функциональные указатели. Я просто укажу, что если вы напишите
void func0(void) { printf( "0\n" ); }
void (*func0)(void);
у вас на самом деле есть два совершенно не связанных объекта с одинаковым именемfunc0
, Первыйfunc0
этоfunction, второйfunc0
этоvariable с указателем типа на функцию.
Предполагая, что вы объявили свойvariable func0
глобально (вне какой-либо функции), он будет автоматически инициализирован нулем, поэтому компилятор прочитает вашу строку
void (*func0)(void);
как
void (*func0)(void) = NULL;
Так что переменнаяfunc0
будет инициализирован со значениемNULL
и на большинстве системNULL
будет на самом деле0
.
Ваш отладчик теперь говорит вам, что вашvariable func0
имеет значение0x0000
, который0
, Так что это действительно не большой сюрприз.
На ваш вопрос относительно & quot; исправить & quot; - ну, я полагаю, вы хотите указатель на функцию, указывающую на вашу функциюfunc0
, так что вы можете сделать следующее:
void func0(void) { printf( "0\n" ); }
void (*pFunc)(void) = func0;
или даже лучше (хотя на большинстве компиляторов нет необходимости) вы можете написать
void (*pFunc)(void) = &func0;
поэтому вы инициализируете свою переменнуюpFunc
(Я настоятельно рекомендую переименовать его!), Чтобы указать наfunc0
, Точнее: вы берете адрес&...
функцииfunc0
и присвойте это значение вашей переменнойpFunc
.
Теперь вы можете "позвонить" указатель функции (что означает вызов функции, на которую указывает указатель функции) посредством:
pFunc(); //will call function func0