1.典型的內存分布情況:
2.各段相關說明:
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;
}