Подтвердить что ты не робот

Что означает "typedef void (* Something)()" означает

Я пытаюсь понять, что это значит, код, который я ищу, имеет

в .h

typedef void (*MCB)();
static MCB     m_process;

in.C

MCB Modes::m_process = NULL;

И иногда, когда я делаю

m_process();

Я получаю ошибку сегментации, возможно, потому, что память была освобождена, как я могу отлаживать ее при освобождении?

Надеюсь, мои вопросы ясны.

4b9b3361

Ответ 1

Он определяет тип указателя на функцию. Функции возвращают void, а список аргументов не указан, потому что вопрос (в настоящее время, но, возможно, ошибочно) помечен C; если бы он был помечен С++, то функция вообще не принимала бы никаких аргументов. Чтобы сделать его функцией, которая не принимает аргументов (в C), вы должны использовать:

typedef void (*MCB)(void);

Это одна из областей, где есть существенная разница между C, которая еще не требует - все функции должны быть прототипированы до того, как они будут определены или использованы, и С++, что делает.

Ответ 2

Он вводит тип указателя функции, указывая на функцию, которая ничего не возвращает (void), не принимает никаких параметров и не называет новый тип MCB.

Ответ 3

typedef определяет MCB как тип указателя на функцию, которая не принимает аргументов, и возвращает void.

Обратите внимание, что MCB Modes::m_process = NULL; - это С++, а не C. Также, в C, typedef действительно должен быть typedef void (*MCB)(void);.

Я не уверен, что вы подразумеваете под "память была освобождена". У вас есть статический указатель на функцию; функция не может быть освобождена. В лучшем случае ваш указатель был reset где-то. Просто отлаживайтесь с часами памяти на m_process.

Ответ 4

Это указатель на функцию. Вы получаете сообщение SEGMENTATION FAULT, потому что пытаетесь сделать вызов функции, адрес которой недействителен (NULL).

В соответствии с вашим конкретным образцом функция не должна возвращать значение (void) и не должна получать никаких параметров ().

Это должно работать:

void a()
{
    printf("Hello!");
}

int main(int arcg, char** argv)
{
    m_process = a;
    m_process(); /* indirect call to "a" function, */
    // Hello!
}

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

Ответ 5

Давайте возьмем пример

typedef void (*pt2fn)(int);

Здесь мы определяем тип pt2fn. Переменные этого типа указывают на функции, которые принимают целое число в качестве аргумента и не возвращают никакого значения.

pt2fn kk;

Здесь kk - это переменная типа pt2fn, которая может указывать на любую функцию, которая принимает целое число в качестве входных данных и не возвращает никакого значения.

Ссылка: https://cs.nyu.edu/courses/spring12/CSCI-GA.3033-014/Assignment1/function_pointers.html