C 言語コードのメモリ空間レイアウト: ヒープ、スタック、データ セグメント、bss セグメント、テキスト セグメント (コード セグメント)

1. プログラムメモリの割り当て

======================
参考:
https://blog.csdn.net/weixin_44564958/article/details/122873470

======================

メモリは、下位アドレスから上位アドレスに向かって、テキスト セグメント (text)、データ セグメント (.data)、bss セグメント、ヒープ (heap)、スタック (スタック) に分割されます。

ここに画像の説明を挿入します

  • テキスト セグメント (テキスト): (コード セグメントとも呼ばれる) は
    主にプロセスのバイナリ プログラム コードを保存し、読み取り可能な定数や変数も保存します。文字列定数
  • データ セグメント (.data) には、
    0 以外に初期化されたグローバル変数と静的変数が格納されます。
  • bss セクションの
    初期化されていないグローバル変数 (初期化されていない場合、グローバル変数はデフォルトで 0 に設定されます)、または 0 に初期化されたグローバル変数。
    注: bss セグメントはプレースホルダーを表し、このセグメント内のデータにはスペースは割り当てられず、必要なスペース サイズのみが記録されます。
  • ヒープは
    、メモリを動的に割り当てるために使用されます。ヒープは、malloc などの関数を使用して割り当てられ、free や delete などの関数によって解放されます。メモリが手動で解放されない場合、プログラムの終了後にオペレーティング システムによって解放されます。
    注: これは、メモリの下位アドレスから上位アドレスまで拡張されるデータ構造です。
  • スタックには
    動的ローカル変数が格納され (グローバル変数と静的変数は静的領域に格納されることに注意してください)、関数パラメータと戻り値もここに格納されます。
    注: これは、メモリ アドレスが上位アドレスから下位アドレスまで広がるデータ構造です。

======= -
グローバル/静的ストレージ領域:
図に示すように、グローバル/静的ストレージ領域には、データ セグメント (データ) と bss セグメントの 2 つの部分が含まれます。

- 定数記憶域:
コンパイル中に記憶域サイズを決定できる定数。この定数は変更できません。

- 注:
- RAM に保存: データ セグメント (.data)、bss セグメント、ヒープ、スタック (スタック);
- ROM に保存: テキスト セグメント (テキスト)、定数ストレージ。

2. 例

次のコードは、変数と定数がメモリのどの領域に配置されるかを示しています。

//main.c源文件

int a = 0; //全局初始化为0   全局/静态存储区中bss段
char *p1; //全局未初始化区   全局/静态存储区宗data段 

int main()
{
    
    
	int b; //局部变量     栈
	char s[] = "abc"; //局部变量   栈
	char *p2; //局部变量  栈
	char *p3 = "123456"; //p3在栈上;123456\0 这个值是常量,放在常量存储区(代码段text);
	static int c = 0;  //静态变量初始化为0  全局/静态储存区中bss段 
	p1 = (char *)malloc(10);//malloc分配保存在  堆
	p2 = (char *)malloc(20);//malloc分配保存在  堆
	strcp(p1, "123456");    //123456\0 这个值放在常量存储区(代码段中)
	
	return 0;
}

3. グローバル変数とスタティック変数を bss セクションで 0 に初期化するか、data セクションで初期化するかの問題について。

グローバル/静的記憶領域へのデータセグメントとbssセグメントの格納について:
多くのブログでは、
データセグメントには初期化されたグローバル変数と静的変数が配置され、
bssセグメントには初期化されていないグローバル変数と静的変数が配置されていると書かれています
が、注意事項では朱友鵬先生の言葉 上記は次のとおりです。
データセグメントすでに配置されています初期化が0ではないグローバル変数と静的変数 (追加の初期化は 0 ではありません)
BSSセクション場所初期化されていない、または 0 に初期化されていますグローバル変数とスタティック変数(初期化されていない、または0に初期化されている変数はbssセクションに配置されます)

以下のように: int a; //初期化されていないグローバル変数 (bss セクションに配置)
ここに画像の説明を挿入します
int a = 0; //0 に初期化されたグローバル変数
ここに画像の説明を挿入します
int a = 1; //0 に初期化されていないグローバル変数 (bss セクションに配置)データセクション内) )
ここに画像の説明を挿入します
要約:
1. 上記で取得した実際のサイズから、グローバル変数と静的変数は 0 に初期化されたときに bss セグメントに配置されます。

おすすめ

転載: blog.csdn.net/weixin_42640280/article/details/127214528