C++变量存储位置

12 篇文章 0 订阅

转自:1.https://blog.csdn.net/songzige/article/details/51329512

           2.https://zhuanlan.zhihu.com/p/40536998

C语言在内存中一共分为如下几个区域,他们分别是:

1 内存栈区: 存放局部变量名;

2 内存堆区: 存放new或者malloc出来的对象;

3 常数区:存放局部变量或者全局变量的值;

4 静态区: 用于存放全局变量或者静态变量;

5 代码区: 二进制代码。

 

上面的就是内存分配的机制,有助于我们理解指针的概念。

C/C++并不具备类似java的垃圾回收机制,所以需要对堆里面的数据进行及时的销毁,不然的话容易导致内存泄漏,使用free和delete销毁new和malloc申请的堆内存,而栈内存却是动态释放的,

全局变量/静态局部变量保存在全局的数据数据区(静态区),初始化的和未出实话的分别保存在一起;而普通的局部变量保存在堆栈中;

 

1.栈区(stack):程序运行时由编译器自动分配
存放:函数的参数值,局部变量的值。
存储连续,其操作方式类似于数据结构中的栈。
栈区处于相对较高的地址以地址的增长方向为上的话,栈地址是向下增长的,所以空间有限,windows下大多1-2M。


2.堆区(heap): 
在内存开辟另一块存储区域。一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
存放:程序员申请的内存空间。
存储不连续,数据结构中的堆是两回事,类似于链表,受限于虚拟内存,32bit系统可达到4G。
堆区是向上增长的用于分配程序员申请的内存空间。


3.全局区(静态区)(static)—编译器编译时即分配内存。
全局变量和静态变量的存储是放在一块的,
初始化的全局变量和静态变量在一块区域,
未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 
程序结束后由系统释放。


附:静态局部变量只对自己定义的函数体可见。
    静态全局变量具有文件作用域,两个不同的源文件可以名字相同的静态全局变量,表示两个变量。
    而全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。


4.只读区
常量区:常量字符串就是放在这里的。程序结束后由系统释放。
程序代码区:存放函数体的二进制代码。
5.栈中的存储内容 
  栈: 在函数调用时进栈顺序
a.主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址
b.数的各个参数,在大多数的C编译器中,参数是由右往左入栈的
c.然后是函数中的局部变量。(注意静态变量是不入栈的,在全局区)。 


出栈顺序,逆序。
6.堆的内容:堆的头部用一个字节存放堆的大小
  2、例子程序 

    这是一个前辈写的,非常详细 

 

    //main.cpp 

    int a = 0; 全局初始化区 

    char *p1; 全局未初始化区 

    main() 

    { 

    int b;// 栈 

    char s[] = "abc"; //栈 

    char *p2; //栈 

    char *p3 = "123456"; 123456\0";//在常量区,p3在栈上。 

    static int c =0; //全局(静态)初始化区 

    p1 = (char *)malloc(10); 

    p2 = (char *)malloc(20); 

    //分配得来得10和20字节的区域就在堆区。 

    strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 

    } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值