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

目录

 

一、程序的内存分配

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

例子程序:

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

例子程序

逐个讲解


一、程序的内存分配

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

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

栈区      

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

堆区   

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

全局量(静态量)  

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

常量           

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

代码区         

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

栈区(stack)

由编译器自动分配释放,存放函数的参数值,局部变量的值;其操作方式类似于数据结构中的栈

堆区(heap)

一般由程序员分配释放(动态内存分配),程序员申请和释放,如果程序员不释放,在程序结束时由OS回收。

注意其与数据结构中的堆是两回事,分配方式与链表相似;

全局区(静态区)(static)

全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域;程序结束后由系统释放;

常量区(const)

常量字符串就是放在这里;程序结束后由系统释放;

程序代码区

 

例子程序:

#include <stdio.h>

#include <stdlib.h>

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 <stdio.h>

#include <stdlib.h>

//全局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’    |

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

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

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

 

 

总结:

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

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

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ah_yl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值