编译器对内存的分配

在正式开始今天的博文之前,先看一段代码,思考这段代码有可能出现的情况:

int main() 
{
        int  j, b[10];
          for(j = 1; j <= 10; ++j){
                  b[j] = 0;
          }
}
看完这段代码后,如果觉得这段代码没有什么坑,那不妨注意一下j的范围是从1-10,而b[10]会导致b数组越界哦。思考到结果了吗?先来 看看一些内存知识吧。

我们在C/C++中学的变量分三种:局部变量、全局变量(静态变量和全局变量)、堆变量

局部变量 由 程序员定义普通变量时编译器在内存中的栈空间为其分配一段内存,如:

int b[10], j;

全局变量  由编译器在内存中的静态存储区分配空间,如:

int x, y; // 全局

int main(){

  static int m, n; // 静态

}

堆变量   由程序员用malloc或new在堆上申请一段内存空间,如:

int *a = new int[10], *i = new int; // 动态内存分配

可见编译器通过将内存逻辑划分为不同区段来提供程序员访问内存的权限,而每段空间都有各自的大小,一旦程序员在使用过程中将该大小哦耗尽,就会出现内存不足错误,比如典型的Stack OverFlow 

了解了变量的存储后,再来思考一个问题,当我在同一个变量区定义几个不同变量时,他们在内存中是如何排列的?

比如我定义两个局部变量

int a,b;

那么到底是编译器先为a分配地址,还是先为b地址分配?(这还用思考吗?肯定是先定义的先分配啦)分配地址后,到底是a的地址高于b的地址,还是b的地址高于a的地址?也就是下面这两张图哪张图是正确的?

想知道答案只需要将这两个的地址分别打印出来查看一下即可。这里小编就不打印了,建议读者自行打印。

打印结果是a的地址高于b的地址,也就是说左图正确。

但是注意这里的a,b均是局部变量,也就是变量存储在栈区,根据结果我们发现在栈区定义的变量是先定义的变量分配在高地址区域,后定义的变量被分配在低地址区域(左图)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值