程序的内存分配,以及局部const和全局const在系统内存中的存储情况、指针感悟~

目录

 

一、程序的内存分配

1、1 程序的内存分布情况

例子程序:

二、局部const和全局const在系统内存中的存储情况

例子程序

逐个讲解


一、程序的内存分配

1、1 程序的内存分布情况

程序的内存分配,以及局部const和全局const在系统内存中的存储情况、指针感悟~_第1张图片

----------------        高地址  eg0x607080

栈区      

----------------

堆区   

----------------

全局量(静态量)  

----------------                eg0x405060

常量           

----------------   

代码区         

----------------        低地址  eg0x203040

栈区(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;

}

关于各种变量在系统中如何分配,可以看后面部分的代码,以及调试分析;

 

二、局部const和全局const在系统内存中的存储情况

例子程序

#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";

}

程序的内存分配,以及局部const和全局const在系统内存中的存储情况、指针感悟~_第2张图片

利用eclipse进行断点调试,可以显示各个变量的具体的值以及在系统中存储的位置

 

逐个讲解

1

//全局const 常量 str ===>存储在系统的常量区

const char str[16] = "hello";

str为全局const常量,因而其存储于系统的常量区,str的值就是该全局常量数组所存放的地址0x405054;

程序的内存分配,以及局部const和全局const在系统内存中的存储情况、指针感悟~_第3张图片

//全局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关键字,但是均位于系统的栈区;

程序的内存分配,以及局部const和全局const在系统内存中的存储情况、指针感悟~_第4张图片

两者的地址分别为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’    |

---------------------------------------------------- 低地址

程序的内存分配,以及局部const和全局const在系统内存中的存储情况、指针感悟~_第5张图片

其实指针就是指向系统中的一个地址,同时指针也保存在系统中的某个内存中;

我们可以把指针看作一个[变量],只不过这个[变量]是和地址相关的。

 

 

总结:

第一节的那段代码也可以通过调试的方法去看各个变量在系统中的存储位置。就不赘述了。

关于指针内容没有详述,希望看到以上的调试说明,能自己有一点感悟;

你可能感兴趣的:(c语言,内存管理,字符串,指针)