歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C/C++程序運行時進程的內存分布情況

1.典型的內存分布情況:

2.各段相關說明:

  • 代碼段[.text]: 存儲機器碼序列/全局常量/代碼/字符串常量.
  • 初始化數據段: 初始化的全局變量/初始化的(局部/全局)靜態變量(static修飾的變量)。
  • 未初始化數據段[.bbs]: 未初始化的全局變量/未初始化的(局部/全局)靜態變量(static修飾的變量).
  • 堆(從低地址往高低至增長): 所使用的局部變量還是在棧上,內容則在堆上.手動釋放或者程序結束時由操作系統釋放回收.
    * 由程序員分配[new/malloc/realloc/calloc].
    * windows下, 申請的堆空間一般小於2GB。
  • 棧(從高地址往低地址增長): 局部變量/局部常量(const)[局部只讀變量]/函數調用時返回地址/調用者的環境信息(例如某些機器寄存器).
    • 由編譯器自動分配釋放管理.
    • windows下,申請的棧空間一般為2MB。
    • Linux默認的棧空間是8MB,可以用ulimit -s 命令來修改。

3.注:
 1). 對於32位Intel x86 處理器上的Linux, 正文段(.text)從0x8048000單元(每個程序都虛擬一個)開始,棧底則在0xC0000000之下開始.

4. 相關文章:
 1). 關於static:
 2). 關於const[#define]:

5. 相關代碼:
1). 輸出各種變量,數據的位置信息

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

static int init_static = 10;
static int uninit_static ;
int init_overall = 20;
int uninit_overall;
char *init_str_overall = "str_overall";
char *uninit_str_overall;
char init_strArray_overall[20]= "strArray_overall";
char uninit_strArray_overall[20];

int main(void)
{
     static int init_static_part = 30;
     static int uninit_static_part;
     int init_part = 40;
     int uninit_part;
     char *p = (char *)malloc(sizeof(char) * 8);
     char *str = "ABCDEFG";
     char init_strArray[10] = "BCDEFGH";                !!!注意這個,值也是在棧中!!!
     char uninit_strArray[10];

     printf("全局靜態初始化變量:        變量的地址 = (數據段)%p, 值的地址:%p\n", &init_static, &init_static);
     printf("全局靜態初未始化變量:      變量的地址 = (數據段)%p, 值的地址:%p\n", &uninit_static, &uninit_static);
     printf("全局初始化變量:            變量的地址 = (數據段)%p, 值的地址:%p\n", &init_overall, &init_overall);
     printf("全局未初始化變量:          變量的地址 = (數據段)%p, 值的地址:%p\n", &uninit_overall, &uninit_overall);
     printf("!!!全局初始化指針字符串:   變量的地址 = (數據段)%p, 值的地址:(代碼段)%p\n", &init_str_overall, init_str_overall);
     printf("!!!全局未初始化指針字符串:   變量的地址 = (數據段)%p, 值的地址:()%p\n", &uninit_str_overall, uninit_str_overall);
     printf("!!!全局初始化字符串數組:   變量的地址 = (數據段)%p, 值的地址:(數據段)%p\n", &init_strArray_overall, init_strArray_overall);
     printf("!!!全局未初始化字符串數組:  變量的地址 = (數據段)%p, 值的地址:(數據段)%p\n", &uninit_strArray_overall, uninit_strArray_overall);
     printf("局部靜態初始化變量:        變量的地址 = (數據段)%p, 值的地址:%p\n", &init_static_part, &init_static_part);
     printf("局部靜態未初始化變量:      變量的地址 = (數據段)%p, 值的地址:%p\n", &uninit_static_part, &uninit_static_part);
     printf("局部初始化變量:            變量的地址 = (棧)%p, 值的地址:%p\n", &init_part, &init_part);
     printf("局部未初始化變量:          變量的地址 = (棧)%p, 值的地址:%p\n", &uninit_part, &uninit_part);
     printf("!!!局部動態分配變量:       變量的地址 = (棧)%p, 值的地址:(堆)%p\n", &p, p);
     printf("!!!局部初始化指針變量:     變量的地址 = (棧)%p, 值的地址:(代碼段)%p\n", &str, str);
     printf("!!!局部初始化字符數組:     變量的地址 = (棧)%p, 值的地址:(數據段)[錯!]%p\n", &init_strArray, &init_strArray[0]);
     printf("!!!局部未初始化字符數組:   變量的地址 = (棧)%p, 值的地址:(數據段)[錯!]%p\n", &uninit_strArray, &uninit_strArray[0]);

     return 0;
}

Copyright © Linux教程網 All Rights Reserved