C/C++程序的内存分布

 

    理解C/C++程序中的内存分布,可以帮助我们减少编程时犯常见的错误,如将指向局部变量的地址返回等。在C/C++中,通常可以把内存理解成4个分区:栈、堆、全局/静态存储区和常量存储区。

    (1)栈:通常是用于那些在编译期间就能确定存储大小的变量的存储区,用于在函数作用域内(块作用域)创建、在离开作用域后自动销毁的变量的存储区。通常是局部变量、函数参数等的存储区。它的存储空间是连续的,两个紧挨着定义的局部变量,他们的存储空间也是紧挨着的。栈的大小通常是有限制的,如Visual C++编译器默认栈的大小是1M;而在Unix-like系统中,程序运行的栈的大小不能由编译器(如GCC)来控制,而是由环境变量来设定的。linux中一般默认为10MB。

    (2)堆:通常是用于那些在编译期间不能确定存储大小的变量的存储区,它的存储空间是不连续的,一般由malloc(或new)函数来分配内存块,并且需要用free(delete)函数来释放内存。如果程序员没有将它释放,则会出现常说的内存泄漏问题。需要注意的是,两个紧挨着定义的指针变量,所指向的malloc出来的两块内存并不一定是紧挨着的。另外需要注意的一点是,堆的大小几乎是不受限制的,在一个地址线为32位的操作系统上,理论上每个程序的可寻址空间是4GB。

    (3)全局/静态存储区:和“栈”类似,通常是用于那些在编译期间就能确定存储大小的变量的存储区,但它用于的是在整个程序运行期间都可见的全局变量和静态变量。如在函数体中用关键字static定义的变量。

    (4)常量存储区:和“全局/静态存储区”类似,通常是用于那些在编译期间就能确定存储大小的常量的存储区,并且在程序运行期间,存储区内的常量也是全局可见的。这是一块比较特殊的存储区,在它里面存放的是常量,不允许被修改。如字符串常量就是存在该内存区域内。

    通常,变量标识符的的意义在于它给一块内存存储区提供了名字,以方便程序对这块内存进行读写。左值和右值是C/C++中一个重要的概念,简单的理解,左值是内存存储区的名字,右值是存放在存储区中的值。

 

                                                                             --斌哥整理编辑

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值