目录
一、程序的内存分配
1、1 程序的内存分布情况
例子程序:
二、局部const和全局const在系统内存中的存储情况
例子程序
逐个讲解
---------------- 高地址 eg:0x607080
栈区 ①
----------------
堆区 ②
----------------
全局量(静态量) ③
---------------- eg:0x405060
常量 ④
----------------
代码区 ⑤
---------------- 低地址 eg:0x203040
栈区(stack)
由编译器自动分配释放,存放函数的参数值,局部变量的值;其操作方式类似于数据结构中的栈
堆区(heap)
一般由程序员分配释放(动态内存分配),程序员申请和释放,如果程序员不释放,在程序结束时由OS回收。
注意其与数据结构中的堆是两回事,分配方式与链表相似;
全局区(静态区)(static)
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域;程序结束后由系统释放;
常量区(const)
常量字符串就是放在这里;程序结束后由系统释放;
程序代码区
#include
#include
int global_v = 0; //全局初始化区 ③
char *ptr1; //全局未初始化区 ③
int main()
{
int local_v; //栈区 ①
char s[] = "stack"; //栈区①
char *ptr2; //栈区①
char *ptr3 = "123456"; // "123456"在常量区④,ptr3在栈区①
static int static_v = 0; //全局(静态)初始化区③
//分配得来的10字节在堆区②,ptr1还是在全局未初始化区③
ptr1 = (char*)malloc(10);
//分配得来的20字节在堆区②,ptr2还是在栈区①
ptr2 = (char*)malloc(20);
return 0;
}
关于各种变量在系统中如何分配,可以看后面部分的代码,以及调试分析;
#include
#include
//全局const 常量 str ===>存储在系统的常量区
const char str[16] = "hello";
//全局const 常量g_val ===>存储在系统的常量区
const char g_val = 100;
int main()
{
//局部const常量 str_t===>存储在系统的栈区,“hello”是常量字符串的拷贝,也存在系统的栈区
const char str_t[] = "hello";
//局部const常量 val===>存储在系统的栈区
const char val = 100;
//ptr ptr1 ptr2 局部指针变量存储在系统的栈区,ptr ptr1 ptr2指向同一个地址
//“hello”为常量字符串,存储在系统的常量区
//ptr ptr1 ptr2 指向的是系统常量区的地址
char* ptr = (char*)0x00405065;
char* ptr1 = "hello";
char* ptr2 = "hello";
}
利用eclipse进行断点调试,可以显示各个变量的具体的值以及在系统中存储的位置
1
//全局const 常量 str ===>存储在系统的常量区
const char str[16] = "hello";
str为全局const常量,因而其存储于系统的常量区,str的值就是该全局常量数组所存放的地址0x405054;
//全局const 常量g_val ===>存储在系统的常量区
const char g_val = 100;
&g_val = 0x405064,g_val在系统中的存储情况如下;
----------------------------------------------------
| addr:0x405064 : g_val |
----------------------------------------------------
2
//局部const常量 str_t===>存储在系统的栈区,“hello”是常量字符串的拷贝,也存在系统的栈区
const char str_t[] = "hello";
//局部const常量 val===>存储在系统的栈区
const char val = 100;
局部const变量 str_t 和 val,两者虽定义了const关键字,但是均位于系统的栈区;
两者的地址分别为0x61ff0a以及 0x61ff1f位于系统的栈区
3
//ptr ptr1 ptr2 局部指针变量存储在系统的栈区,ptr ptr1 ptr2指向同一个地址
//“hello”为常量字符串,存储在系统的常量区
//ptr ptr1 ptr2 指向的是系统常量区的地址
char* ptr = (char*)0x00405065;
char* ptr1 = "hello";
char* ptr2 = "hello";
局部变量指针,ptr,ptr1,ptr2,三者均位于栈区内存中如下
---------------------------------------------------- 高地址
| addr:0x61ff18 : ptr |
----------------------------------------------------
| addr:0x61ff14 : ptr1 |
----------------------------------------------------
| addr:0x61ff10 : ptr2 |
----------------------------------------------------
……
……..
----------------------------------------------------
| addr:ptr(ptr1、ptr2): ‘ h’ |
---------------------------------------------------- 低地址
其实指针就是指向系统中的一个地址,同时指针也保存在系统中的某个内存中;
我们可以把指针看作一个[变量],只不过这个[变量]是和地址相关的。
总结:
第一节的那段代码也可以通过调试的方法去看各个变量在系统中的存储位置。就不赘述了。
关于指针内容没有详述,希望看到以上的调试说明,能自己有一点感悟;