2012-03-25 14 views
5

スタックとヒープ上の変数(ポインタ)のアドレスの長さに相関があるかどうか不思議です。多くの場合、スタック変数に関するものは通常、ヒープと比較して長いことがわかりました。例えば、以下の簡単なテストを考慮する:スタックとヒープのメモリ位置パターン

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int i = 0; 
    int *j = malloc(sizeof(int)); *j = 0; 

    printf("&i = %p\n j = %p\n", &i, j); 

    free(j); 
    return 0; 
} 

出力:

&i = 0x7fffe9c7fa5c 
j = 0x100e010 

これらの結果は、Linuxはgccを使用して得られます。これはOS /コンパイラに依存する可能性がありますか?

+0

100%確信はありませんが、CPU/OS /コンパイラ固有の順番であると思います。また、物理アドレスが表示されない可能性もあります。また、ヒープが大きくなり、スタックが小さくなるので、スタック変数のアドレスが下位になります。 – Corbin

答えて

2

結果は、プログラムのアドレス空間内のヒープとスタックの位置によって異なります。これらはリンカとプロセッサアーキテクチャによって決定されます。

ASLRのため、正確な数値は現代のシステムではランダムである必要があります。

しかし、通常、ヒープは上向きに成長し、下向きに積み重なります。さらに、パフォーマンスとメモリ管理の理由から、ヒープとスタックは常にpage境界で開始します。

2

私は、スタックのスタックとヒープと呼ばれるメモリの物理的な部分が原因だと思います。彼らは反対側の端から始まり、真ん中に向かって成長するので、一方が低く、他方がより高くなるのは理にかなっています。 2つの連続した変数をスタックに割り当て、2つ連続する変数をヒープに割り当てると、何が起こるかを調べることは面白いでしょう。これは、スタックとヒープがどのように成長するのかを理解するのに役立ちます。実際には、私はこれが新しいスタックフレーム(新しいメソッド)を作成し、そこに2番目のバールを割り当てる必要があると思います。そうでなければ同じスタックフレームに残ります。

+0

通常のユーザ空間プログラムの場合、アドレス空間は物理メモリアドレスとは関係ありません。そうしないと、特権のないプロセスが特定の物理メモリを割り当ててDoS攻撃を開始し、別のプロセスが同じメモリアドレスを割り当てないようにすることができます。それはすべての仮想です。 – phihag

+0

システムに応じて、物理メモリまたは仮想メモリが使用されている可能性があります。とにかく、両端から始まって真ん中に向かって成長すると、使用可能なすべてのスペースを最大限に柔軟に使用できます。 –

関連する問題