0

想像するだけでも頭が麻痺してきます。

1)関数のアドレスから始まるビット/バイトには何がありますか?つまり、整数変数のアドレスでは、2 進数で数値を表す 1 と 0 の 4 バイト (32 ビット システムの場合) を視覚化します。フォーム.文字変数の場合、文字のASCII値で1バイトを視覚化します.aの場合、doubleそれに応じて8バイトを視覚化します.しかし、関数のアドレスで始まるバイトで一体何を視覚化する必要がありますか?呼び出しスタックは関数が呼び出されたときに作成されますが、関数自体はどうですか?そのアドレスには関数の式、ifs、loopsなどがありますか?関数を表すこれらのビット/バイトは複雑すぎて、人間が視覚化するのとは異なり、人間が視覚化することはできません言うintegers

2)関数に使用できますsizeofか?なぜ、またはできないのですか?関数に割り当てられたサイズを決定する方法がわからない場合、関数はどのようにアドレスを持っているのでしょうか?アドレスを持っているかのように、サイズと関数へのポインターがあるので、ポインター アドレスから始まる解釈するバイト数は、ポインターによってどのように決定されるのでしょうか?結局のところ、これらのポインターを使用して関数を呼び出すことができます。

この点に関して、Books と Google はまったく役に立ちませんでした。

4

3 に答える 3

2
  1. 何でも構いません。特定のものである必要はありません。

  2. いいえ。関数のアドレスは単なるエントリ ポイントです。たとえば、連続したメモリ位置を占有する必要さえありません。

通常、関数アドレスは、その関数の実際のマシン コードが始まる場所です。関数がどこで終了するかを確認する信頼できる方法はありません。プラットフォームによっては、ソース コードに表示される関数を順番にレイアウトする場合があります。しかし、他のプラットフォーム、特にIPOのあるプラットフォームは、それほど単純ではありません。

于 2013-05-04T09:41:51.940 に答える
1

In most C implementations, a pointer to a function is implemented as an address of the start of the function’s machine code. The bytes at that address are the bytes of the instructions that are executed when the function is called.

In some implementations, a pointer to a function is implemented as an address of data about the function, such as data that contains the address of the machine code and a description of the function’s parameters or register use.

これらの詳細はC標準の一部ではなく、実装によって異なるため、この回答は教育目的のみです。

于 2013-05-04T09:50:36.757 に答える
1

1. 私は通常、関数ポインターが指すメモリーを、バイトのストリームではなく、アセンブラーのニーモニックそのものとして視覚化します。固定幅の命令を使用するアーキテクチャを使用している場合は、整数の配列として視覚化できます。それぞれが異なる命令をエンコードしています。

2. いいえ、できません。SO には、関数を作成できない理由を説明するいくつかの優れた回答がありsizeof()ますが、基本的には、その関数のコードがすべて一緒であることが保証されていないため、サイズを決定することは不可能であるという事実に要約されます。コンパイラは、必要に応じて別の関数にジャンプする命令を発行できます (皮肉なことに、これはまさに、関数を呼び出したり、関数ポインターを呼び出すときに発生することです;))。

何かのアドレスを持ち、そのサイズがわからないことは完全に可能であり、有効ですvoid。たとえば、ポインターを見てください。ポインターが指すデータのサイズがわからないのと同様にvoid、関数ポインターが指すコードのサイズもわかりません。

于 2013-05-04T09:57:04.350 に答える