Что означает "typedef void (* Something)()" означает
Я пытаюсь понять, что это значит, код, который я ищу, имеет
в .h
typedef void (*MCB)();
static MCB m_process;
in.C
MCB Modes::m_process = NULL;
И иногда, когда я делаю
m_process();
Я получаю ошибку сегментации, возможно, потому, что память была освобождена, как я могу отлаживать ее при освобождении?
Надеюсь, мои вопросы ясны.
Ответы
Ответ 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