C言語のメモリでLinuxのレイアウト

一例として、32ビットLinux環境で

カーネル空間とユーザ空間

32環境論は、オペレーティングシステムのカーネル(カーネル空間)、および3Gユーザー(ユーザー空間)に、残りの仮想アドレス空間、1Gの4グラムを持っています

クラシックメモリモデル

ここに画像を挿入説明

メモリパーティション 説明
プログラムコード領域 バイナリコード格納機能体。
定常領域 定数、文字列定数は、読み取り専用ではなく書き込めませんすることができます。
グローバルデータ グローバル変数、静的変数、読む、書きます。
ヒープ 放出された場合、アプリケーションプログラマは、プログラムの終了後に、オペレーティングシステムのリカバリをリリース
スタック領域 など、関数のパラメータ、ローカル変数を格納します

プログラムコード領域、定常領域、及びグローバルデータプログラムでは、良好な分布後にメモリにロードされ、プログラムの実行中に存在している、破壊することができない増加させることはできない(サイズは固定されている)のみオペレータによってプログラムの実行が終了するまで待つことができます彼らはメモリにされているように、システム復旧、そうグローバル変数、文字列定数などは、プログラム内のどこにでもアクセスすることができます。

スタック領域:プログラムのプログラムコード領域、定常領域、及びグローバルデータが良好な分配後にメモリにロードされ、プログラムの実行中に存在していた、(サイズが固定されている)を大きくすることができない破壊することができない、唯一のプログラムの実行が終了するまで待つことができます彼らはメモリにされているようオペレーティングシステムから回復した後、グローバル変数、文字列定数などは、プログラム内のどこにでもアクセスすることができます。

ヒープ:制御メモリ領域への唯一のプログラマが、それは多くの場合、いずれかを置く(このスペースでは、プログラムがメモリの一部に適用され、かつ自由に使用することができ、仮想空間全体の大半を占め、巨大なメモリ空間でありますデータ)。ヒープはない機能や、障害の終わりに、アクティブなプログラムのリリースまで存在します。それは関数の外部で使用することができる限り、データはスタックに関数内で発生しました。

#include <stdio.h>
char *str1 = "c.biancheng.net";  //字符串在常量区,str1在全局数据区
int n;  //全局数据区
char* func(){
    char *str = "C语言中文网";  //字符串在常量区,str在栈区
    return str;
}
int main(){
    int a;  //栈区
    char *str2 = "01234";  //字符串在常量区,str2在栈区
    char  arr[20] = "56789";  //字符串和arr都在栈区
    char *pstr = func();  //栈区
    int b;  //栈区
}
  • 良好な分配に、コンパイル時にメモリグローバル変数、デフォルト値0
  • FUNCでローカル文字列定数()関数「C言語中国語ネットワーク」もに格納されている一定の領域は、依然として出力することができるので、最終的に、FUNC()操作及び破壊の終わりで終了しないであろう。
  • 文字配列ARRスタック領域上の[20]割り当てるメモリストリング「56789」は、むしろ定常領域よりも、このメモリに保存されています。
公開された96元の記事 ウォン称賛11 ビュー6090

おすすめ

転載: blog.csdn.net/weixin_44997886/article/details/104524859