0


0

Cでの数値型のキャスト

私は次のコードでこの質問に対する答えを見つけようとしていますが、ポインターの値(problem3のアドレスはパラメーターと関数のローカル変数から非常に離れていることが判明しました)地獄は `x = problem3;`を指している…​

void problem3(int a) {
    int overflowme[16];
    int x = problem3;
    overflowme[15] = 102;
    printf(" the address of  x is %x\n the addres of the first local is %x\n the addres of the first para is %x\n ", x, &overflowme[15], &a);
}

int main(void) {
    problem3(101);
}

OUTPUT
 the address of  x is 42b613
 the addres of the first local is 12fed8
 the addres of the first para is 12fee4
 Press any key to continue . . .

6 Answer


4


problem3は関数へのポインターです。 Cでは、 `(int)`のようなキャストを使用すると、コンパイラは基本的にすべての型チェックをオフにし、あなたが何をしているのかを知っていると仮定します(この場合のように、意味がない場合でも)-この場合は変換整数へのポインター。

結論-本当に必要な場合を除き、キャストを使用しないでください。


2


_ 上記のコードでx =(int)problem3を割り当てることができる理由を説明できますか _

problem3は関数ポインターであるため(つまり、 関数のメモリアドレス)およびすべてのポインターを整数にキャストできます。

_ 「hello world」をxに割り当てていませんか? _

No. ただし、( `x =(int)" hello world ";`を実行することで)実行したい場合は、「hello world」もポインター(正確にはcharポインター)であるため、上記を適用できます。


1


キャスト(何かの前に((int))を置いたときに何をするか)はそのように魔法のようです。 なんらかの意味を持っているかどうかにかかわらず、それはあらゆる種類のものを取り、それを何か他のもの(この場合は int)に変えます。 絶対に前もって確信があり、他に方法がない限り、キャストの使用は避けてください。

プログラムのコードは、変数と同様にメモリに存在します。 ここで起こっているのは、キャストが、コードがメモリ内のどこにあるかを表す数値を整数に変えていることです。 その整数は、コンパイラーとリンカーが関数のコードを配置することをメモリ内のどこに決定したかに応じて、大きくすることも小さくすることもできます。

printfステートメントは、割り当てを一切行いません。 `%x`は、「printfに渡されたパラメーターの1つを取得して、ここに出力する」というプレースホルダーです。 'x’であるという事実は、プログラム内の変数の名前とは関係ありません。 「x」の意味は、「この整数を通常の10進数ではなく16進数(16進数)で印刷」です。 それに「%u」または「%d」を入れても機能し、10を基数とする符号なし整数または10を基数とする符号付き整数として表される数値を取得します。


0


最初に、実際に関数呼び出しを行うために、「problem3;」の括弧が欠落しています。 次に、 x =(int)problem3`を割り当てると、関数 problem3`のアドレスがxに割り当てられ、intにキャストされます。 あなたが何を達成しようとしているのか分かりませんが、これはCで行うのに完全に合法的なことです。

intにキャストされた関数のアドレスを印刷し、16進数としてフォーマットする場合、おそらく関数のアドレスを16進数として印刷します。 数字が7桁であることに驚いた理由はわかりません。


0


最初の例では、 problem3`関数のアドレスを x`に割り当て、そのアドレスの値を出力しています。

それを `int`にキャストすることは、通常はまったく役に立ちません。 関数の実際のメモリアドレスを知る必要はほとんどありません。

関数のアドレスを取得する必要があるのは、関数を呼び出す(実行する)コードの他の部分に渡す場合のみです。 関数ポインターの使用に関する詳細については、http://www.newty.de/fpt/fpt.html [この記事]を確認してください。


0


関数のアドレス( "problem3"および "main")を印刷しています。 これらのアドレスはコンパイラと実装に完全に依存しているため、直面している6桁と7桁の差があります。