0

構造体で関数ポインターの配列を使用すると、プログラムがクラッシュします。

#include <stdio.h>

typedef void (*FUNCPTR)(void);

void Function_1()
{
    printf(" In Function_1 \n");
}
void Function_2()
{
    printf(" In Function_2 \n");
}

typedef struct St_FUNCPTR
{
    FUNCPTR xxx[2];  
}ST_FUNCPTR;

FUNCPTR fnptr1[2] =
{
    Function_1,
    Function_2
};

ST_FUNCPTR fnptr =
{
    fnptr1 

};

/* The intention is to call Function_1(); through array of function 
   pointers in the structure. */  

int main()
{
    // to call Function_1();
    fnptr.xxx[0]();
    return 0;
}

以下のように構造体が定義されていれば問題なく動作します。

ST_FUNCPTR fnptr =
{
    {Function_1,Function_2},
};

私の問題はどこですか?

4

1 に答える 1

0

私の賭けはここにあります:

ST_FUNCPTR fnptr =
{
    fnptr1 

};

あなたがしようとしているのは、要素が配列を持つ配列である構造を初期化することです。fnptr1 は、関数へのポインターの配列です。
あなたの編集でそれは確かです。int a1[10]=int b[10] とは言えないように、配列を別の配列で初期化することはできません。
明確にするために:ここで fnptr1 は、関数へのポインターへのポインター定数です。ところで、関数へのポインターに変換されている xxx[0] に移動します。
次にコードが行うことは、そのポインターのアドレスを取得し、それfnptr.xxx[0]を関数へのポインターのように扱い、() で呼び出すことです。しかし、そのアドレスの下には関数がなく、関数へのポインタがあるだけなので、クラッシュします。

于 2013-09-18T15:18:59.667 に答える