linuxlmao:
私はルックスがこれを好きなことを交流プログラムを持っています
main.cの
#include <stdio.h>
#define SOME_VAR 10
static int heap[SOME_VAR];
int main(void) {
printf("%p", heap);
return 0;
}
そして、私はコンパイルされたプログラムを数回実行したときに、この出力
0x58aa7c49060
0x56555644060
0x2f8d1f8e060
0x92f58280060
0x59551c53060
0xd474ed6e060
0x767c4561060
0xf515aeda060
0xbe62367e060
なぜそれが常に060で終わるのでしょうか?そして、配列はヒープに格納されて?
編集:私はLinux上だと私は上のASLRを持っています。私は、GCCを使用してプログラムをコンパイル
CTX:
アドレスは理由ASLR(アドレススペースのレイアウトramdomization)の異なります。これを使用して、バイナリは、仮想アドレス空間内の異なる位置にマッピングすることができます。
変数がheap
ある-ヒープ上にあるが、上ではない-それの名前とは対照的にbss
。アドレス空間のオフセットので一定です。
多くのプラットフォーム上:ページは4096バイト(0x1000を進)であるページの粒度、でマッピングされています。これは、アドレスの最後の3進桁が同じである理由、です。
あなたと同じやったときにスタック変数、アドレスがスタックだけどこかにマッピングされていないため、一部のプラットフォーム上の最後の桁(つまりLinuxでの最近のカーネル)でさえを変えるだけでなく、起動時にランダムオフセットを受け取ることができます。