私はこれが何を意味するのか理解しようとしています、私が見ているコードは
.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++の間に大きな違いがある領域の1つです。
関数ポインター型を導入し、何も返さない(void)関数を指し、パラメーターを使用せずに新しい型に名前を付けます[〜#〜] mcb [〜#〜]。
これは関数ポインターです。アドレスが無効な関数(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