0

以下を実行すると、同じメモリアドレスが出力され続けます。

#include <stdio.h>

int array[5] = {2, 4, 6, 8, 10};
int *pointer;


int main()
{
        pointer = array;
        printf("%p:\t%d\n", pointer, *pointer);
        return 0;
}

これが問題かどうかはわかりませんが、 main() 内で宣言すると新しいアドレスが返され続ける場合に、なぜそうなるのか知りたいと思っています。

4

4 に答える 4

2

まさに、たまたま。
異なる実行でアドレスが同じであることに依存することはできません。

于 2012-12-04T09:55:31.570 に答える
1

最近のほとんどのデスクトップ (そしてもちろんサーバー) オペレーティング システムでは、プロセスによって処理されるアドレスはvirtualであることに注意してください。これは、OS がプログラムをロードしてプロセスで実行するときに、RAM の物理ページとプロセスが「見る」仮想ページとの間のマッピングを設定することを意味します。

このマッピングは、プログラムを実行するたびに同じように見えますが、これは厳密には偶然です。オペレーティング システムは、ランダム化や、マッピングを変化させるその他の方法を適用することもできます。

仮想アドレスがあるため、任意の数のプログラムを同時に(並行して)実行して、配列に対してまったく同じアドレスが表示される可能性があることに注意してください。

于 2012-12-04T10:27:13.920 に答える
0

この質問は多くの議論の対象であり、長い歴史があります。

もともと、プログラムが物理メモリで実行されていた場合、物事のアドレスは、実行前にメモリに何があったかに依存していました。

その後、最新のCPUでは、各プロセスが独自のアドレススペースを取得するため、多様性はありません。

次に、セキュリティ担当者が来て、プログラムの開始アドレスとコードの場所を意図的にランダム化することで、さまざまなセキュリティ攻撃を防ぐことができると述べました。それらのいくつかは、より有用なソフトウェアテストを行うために一貫性を改善することが重要であると言ったソフトウェアエンジニアの群衆によってリンチされました。ただし、一部のコンパイラ(Visual Studio 2010など)は、デフォルトでコードの場所のランダム化を実行します。

ほとんどの場合、それはまだ不可能であり、データに必要なものは少なくなります。これが、同じ結果が得られる理由です。

于 2012-12-04T10:25:20.380 に答える
0

投稿したコードの "array" で通常同じアドレスを取得するのに、main 内で array を宣言すると異なるアドレスを取得する理由は、main の外側の配列はグローバル スコープを持ち、単一の固定位置に割り当てられるのに対し、 main 内で宣言された配列は、main に入ったときにスタックに割り当てられます (別の場所から main を呼び出した場合は、複数回割り当てられる可能性があります)。

他の回答で説明されているアドレスをランダム化するセキュリティ機能は、静的な期間を持つ変数ではなく、スタックに適用されます。これは、一般的なエクスプロイトは、敵対的なコードでスタックを上書きし、格納されている戻りアドレスを上書きしてスタックにジャンプすることで機能するためです。スタック上。非スタック変数を悪意のあるコードで上書きしても、攻撃者はそれを実行するという問題が残るため、セキュリティ上の懸念は少なくなります。

于 2012-12-12T21:02:14.390 に答える