我试图理解这意味着什么,我正在查看的代码有
在.h
typedef void (*MCB)();
static MCB m_process;
在.C
MCB Modes::m_process = NULL;
有时当我这样做时
m_process();
我得到分段错误,这可能是因为内存被释放了,当它被释放时我该如何调试?
我试图理解这意味着什么,我正在查看的代码有
在.h
typedef void (*MCB)();
static MCB m_process;
在.C
MCB Modes::m_process = NULL;
有时当我这样做时
m_process();
我得到分段错误,这可能是因为内存被释放了,当它被释放时我该如何调试?
它定义了一个指向函数的类型。函数返回 void,参数列表未指定,因为问题(当前,但可能错误地)标记为 C;如果它被标记为 C++,那么该函数将根本不接受任何参数。要使其成为不带参数的函数(在 C 中),您可以使用:
typedef void (*MCB)(void);
这是 C 和 C++ 之间存在显着差异的领域之一,C 还不需要在定义或使用之前对所有函数进行原型设计,而 C++ 则需要。
它引入了一个函数指针类型,指向一个不返回任何内容(void)的函数,不接受任何参数并命名为新类型MCB。
typedef 定义MCB
为指向不带参数并返回的函数的指针的类型void
。
请注意,这MCB Modes::m_process = NULL;
是 C++,而不是 C。此外,在 C 中,typedef 实际上应该是typedef void (*MCB)(void);
.
我不确定您所说的“内存已释放”是什么意思。您有一个指向函数的静态指针;无法释放函数。最多,您的指针已在某处重置。只需使用内存监视进行调试m_process
。
这是一个函数指针。你得到一个 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 中的某种形式的事件处理。虽然它不是唯一的用途......
举个例子
typedef void (*pt2fn)(int);
在这里,我们定义了一个类型 pt2fn。这种类型的变量指向函数,它接受一个整数作为参数并且不返回任何值。
pt2fn kk;
这里,kk是一个pt2fn类型的变量,它可以指向任何接受一个整数作为输入并且不返回任何值的函数。
参考:https ://cs.nyu.edu/courses/spring12/CSCI-GA.3033-014/Assignment1/function_pointers.html