49

私はこれが何を意味するのかを理解しようとしています、私が見ているコードは

.h

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

.C

MCB Modes::m_process = NULL;

そして時々私がするとき

m_process();

セグメンテーションエラーが発生します。メモリが解放されたことが原因である可能性があります。解放されたときにデバッグするにはどうすればよいですか?

4

5 に答える 5

53

関数型へのポインタを定義します。関数はvoidを返し、質問には(現在、しかしおそらく誤って)Cのタグが付けられているため、引数リストは指定されていません。C ++のタグが付けられている場合、関数は引数をまったく取りません。(Cで)引数をとらない関数にするには、次を使用します。

typedef void (*MCB)(void);

これは、定義または使用する前にすべての関数のプロトタイプを作成する必要がないCとC++の間に大きな違いがある領域の1つです。

于 2010-10-20T21:33:04.073 に答える
6

関数ポインタ型を導入し、何も返さない(void)関数を指し、パラメータを受け取らず、新しい型にMCBという名前を付けます。

于 2010-10-20T21:31:38.600 に答える
5

typedefはMCB、引数を取らず、を返す関数へのポインタの型として定義しますvoid

MCB Modes::m_process = NULL;これはCではなくC++であることに注意してください。また、Cでは、typedefは実際には。である必要がありますtypedef void (*MCB)(void);

「メモリが解放された」とはどういう意味かわかりません。関数への静的ポインタがあります。関数を解放することはできません。せいぜい、あなたのポインタはどこかでリセットされています。でメモリウォッチを使用してデバッグするだけm_processです。

于 2010-10-20T21:33:17.800 に答える
4

これは関数ポインタです。アドレスが無効な関数()を呼び出そうとしているため、SEGMENTATIONFAULTが発生しますNULL

特定のサンプルによると、関数は値(void)を返さず、パラメーターを受け取らないようにする必要があります()

これは機能するはずです:

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

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

関数ポインタは、Cでのイベント処理のいくつかの形式で一般的に使用されます。ただし、それだけではありません...

于 2010-10-20T21:33:37.050 に答える
3

例を見てみましょう

typedef void (*pt2fn)(int);

ここでは、タイプpt2fnを定義しています。このタイプの変数は、引数として整数を取り、値を返さない関数を指します。

pt2fn kk;

ここで、kkはpt2fn型の変数であり、入力として整数を受け取り、値を返さない関数を指すことができます。

参照:https ://cs.nyu.edu/courses/spring12/CSCI-GA.3033-014/Assignment1/function_pointers.html

于 2018-09-22T16:58:28.610 に答える