0

私は混乱しています!次のすべての printf は、関数のアドレスを出力する正しい方法ですか? 私の混乱もお伝えしましょう。これらのすべての printf (つまり、1 番目の printf、2 番目の printf、および 3 番目の printf) を実行するたびに、出力で 02D4 02D4 02D4 が得られますが、1 番目と 2 番目の printf を削除またはコメントすると、3 番目を削除すると出力 02BA としてフォローされます。 printf ステートメント、次の出力 02D0 を取得しています。これら 3 つすべてのコメントを解除すると、次のようになります。 02D4 02D4 02D4 なぜ 1 つのステートメントが他の printf 行の出力に影響するのですか これは実際には関数のアドレスではありませんか? s と &s はアドレスと同じ値を与えると聞いたことがあります (配列のように)。しかし、ここで、b も印刷しようとすると s と &s が影響を受ける理由がわかりません。ここで、b=s または &s です。

#include<stdio.h>
#include<conio.h>
int s(int);
void main()
{
int a=10,*b;
clrscr();
b=s(a++);
b=&s;
printf("%p\n",s);       // 1st printf
printf("%p\n",&s);      //2nd printf
printf("%p\n",b);       //3rd printf
getch();
}
int s(int x)
{
return x;
}
4

1 に答える 1

2

変数または関数のアドレスは、コンパイラとオペレーティング システムの両方が最終的な場所に影響を与える可能性があるため、依存できるものではありません。

しかし、オペレーティング システムが実行可能コードを常に同じアドレスにロードすると仮定すると、関数内のコードの長さを変更すると、main()関数の開始アドレスに大きな影響を与える可能性がありs()ます。したがって、異なる結果が得られます。

于 2014-06-15T13:50:47.323 に答える