2

私は完全に理解していない次のコードを持っています:

void (*foo[ABC]) (int *i) {
    [A] = function1,
    [B] = function2,
    [C] = function3
}

ここAで、BCは整数定数です。

ABC1-以前に定義されていない場合、それは有効な宣言ですか?

2- この初期化方法は何と呼ばれていますか? ( [A] = function1;)

3- の値はfoo[D]? ヌルポインタですか?

4

2 に答える 2

2

「C だとは思わない」は「C ではない」と同等ではありません。


リンクをありがとう、@Kninnug - これは恐ろしいC99 機能 (および C90 の GNU 拡張機能) であり、コードにはエラーがあります: 3 つの関数ポインターの配列のスペルミスの初期化です。次のような修正コードを想像できます。

#define ABC 3

#define A 0
#define B 1
#define C 2

void function1(int *i)
{
}

void function2(int *i)
{
}

void function3(int *i)
{
}

int main(int argc, char *argv[])
{
    void (*foo[ABC]) (int *i) = {
        [A] = function1,
        [B] = function2,
        [C] = function3
    };

    return 0;
}

これはコンパイルされます

また:

の値はfoo[D]? ヌルポインタですか?

さて、何Dですか?もしD >= ABC(両方とも非負の整数であると仮定して)、その要素は存在さえしません。の場合、集合体 (構造体、共用体、および配列) の初期化では、初期化子リストに対応する初期化子式がない要素が暗黙的にゼロで初期化されるため、D < ABCこれはポインターです。NULL

(より正確には、それらは「static記憶期間があるかのように」初期化されます。これはNULL、ポインターの場合の初期化です。)

于 2013-10-27T21:49:09.223 に答える