私の教授は、プログラムがメモリ上でどのように見えるのか混乱しています。私の教授は、スタックとヒープは、スタックがより低いメモリアドレスになるようにお互いに向かって成長すると言いました。linuxのプログラムメモリのレイアウト
最初に私が気になったのは、ヒープが高から低になった場合、ヒープ上に配列を割り当てた場合、2番目の要素へのポインタは、最初の要素?これは、私は少し研究を行なったし、データと未初期化されたデータは、テキストの後に来るので、私は、[OK]を
layout http://www.cyberplusindia.com/blog/wp-content/uploads/2008/10/memorysegment.gif
(私の質問は、Linux上で重視されています)この図に出くわしました
混乱するでしょうセグメントの先頭にあり、プログラムのメモリの先頭にあり、ヒープの後にスタックがあり、最後にコマンドラインの引数と環境が続きます。
しかし、スタックが高アドレスから低位に成長する場合、スタックに割り当てられた配列があると、最初の要素へのポインタも2番目の要素へのポインタよりも値が低くなりますか?スタックが低から高にも成長することを意味していませんか?
私の質問は、Linuxのプロセスの正しいメモリレイアウトは何ですか?ポインタの例でも、共有ライブラリ用のメモリは、(プロセス内のアドレス空間)から来たんどこ
シンプルコード:
#include <iostream>
int data[5];
int main()
{
using std::cout;
using std::endl;
int stack = 0;
short *sptr = reinterpret_cast<short *> (&stack);
int *iptr = new int[5];
cout << "Starting static tests"
<< "\nPointer to first element " << data
<< "\nPointer to second element " << &data[1]
<< "\nstarting stack test " << sptr
<< "\nsecond short " << &sptr[1]
<< "\nStarting heap test " << iptr
<< "\nsecond int " << &iptr[1];
delete[] iptr;
return 0;
}
出力:
Starting static tests
Pointer to first element 0x6013e0
Pointer to second element 0x6013e4
starting stack test 0x7fffdf864dbc
second short 0x7fffdf864dbe
Starting heap test 0x1829010
second int 0x1829014
私はそれが間違って読んでいない限り、私は[ヒープ] RW-P 00000000 0時00分0 016ea000-0170b000 スタックとヒープの両方がローからハイに成長する私の質問の例プログラムのマップをチェックアウトし、 7fffe828a000-7fffe82ab000 rw-p 00000000 00:00 0 [スタック] 途中で.soがたくさんあり、環境とCLAのために予約された場所を見つけることができないようです[地図付きの要点](https:// gist .github.com/ah450/5992828) –
ええ私は完全にespを忘れていましたので、高から低へと成長するはずですが、スタック上に作成された整数への短いポインタを作成するとどうなりますか?秒よりもアドレスが低いですか?または私は何かを逃している? –
コンパイラコードによって生成されるため、値ごとにスタックを割り当てないため、すべてを一度に割り当てます。あなたのプログラムでは、0x50バイトを割り当てようとすると、スタック変数が "-0x34(%rbp)"、 "sptr"が-0x8(%rbp)なので、(uint8_t *)&stack <(uint8_t *) &sptr。これは、スタックポインタを関数ごとに1回だけ減らすためです。 – fghj