我试图理解这是什么意思,我正在查看的代码中有
在.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++需要。
让我们来举个例子
typedef void (*pt2fn)(int);
pt2fn kk;
这里,kk是一个pt2fn类型的变量,它可以指向任何一个输入整数并且不返回任何值的函数。
参考:https://cs.nyu.edu/courses/spring12/CSCI-GA.3033-014/Assignment1/function_pointers.html
MCB
定义为指向不带参数且返回 void
的函数的类型。MCB Modes::m_process = NULL;
是 C++ 而非 C。在 C 中,typedef 应该是 typedef void (*MCB)(void);
。m_process
上调试内存监视即可。这是一个函数指针。你得到了一个段错误,因为你试图调用一个地址无效的函数(NULL
)。
根据你的具体示例,该函数应该返回无值(void
),并且不应该接收任何参数()
。
以下代码应该可以工作:
void a()
{
printf("Hello!");
}
int main(int arcg, char** argv)
{
m_process = a;
m_process(); /* indirect call to "a" function, */
// Hello!
}
函数指针在C语言中通常用于某种形式的事件处理。但这并不是它唯一的用途...
.C
是常见的 C++ 文件扩展名,而且Modes::m_process
在 C 中是无效的。 - SingleNegationElimination