2

Вопрос по c – что означает нулевой указатель на функцию в C?

Скажем, у нас есть указатель на функцию:

void (*func0)(void);

который также определен:

void func0(void) { printf( "0\n" ); }

Но скажем, в какой-то момент мы пытаемся как-то получить доступ к указателю на функцию, тогда, если отладчик MS VS показывает, что func0 фактически указывает на 0x0000, когда я вхожу в код, что это значит? А также, пожалуйста, дайте мне знать, что является лучшим решением? Благодарю.

  • Первая строка определяет указатель на функцию без инициализации. Вторая строка определяет функцию с таким же именем.

    от wildplasser
  • 8

    Это неопределенное поведение для отмены ссылки на нулевой указатель. И

    справление заключается просто в том, чтобы указатель ссылался на соответствующую функцию.

    В вашем случае вы хотите что-то вроде этого:

    void MyFunction(void)
    {
        printf( "0\n" ); 
    }
    

    а затем позже вы можете назначитьfunc0:

    func0 = &MyFunction;
    

    Обратите внимание, что я использую другое имя для переменной указателя функции и фактической функции.

    И теперь вы можете вызвать функцию через указатель функции:

    func0();
    

  • 5

    Я думаю ты путаешь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