0

誰でもできますか?次の C プログラムがどのように機能するかを説明してください(*p)() = fun。コンパイラがこのコードをどのようにコンパイルするかを知る必要があります。

#include<stdio.h>
int fun(); /* function prototype */

int main()
{
    int (*p)() = fun;
    (*p)();
    return 0;
}
int fun()
{
    printf("Hello World\n");
    return 0;
}
4

2 に答える 2

4

各関数はメモリのどこかに存在します。ステートメント:

int (*p)() = fun;

関数 fun のメモリ位置を p に割り当てています。次に、行:

(*p)();

p が指しているメモリ位置に存在する関数を呼び出しています。

Interweb には、「関数ポインタ」に関する情報が満載です。

于 2012-09-13T18:49:18.513 に答える
2

gcc(with -O0)によって生成されたコードを見ると、次のようになります。

    movl    $_fun, -4(%ebp)
    movl    -4(%ebp), %eax
    call    *%eax 

関数のアドレスをスタック内の変数に格納し、funこのアドレスを間接的に呼び出すだけです。

于 2012-09-13T18:46:14.293 に答える