linux和windows栈空间大小,linux与windows栈内存分配区别

转载博客:https://blog.csdn.net/yes_i_am/article/details/52005602

同样的一段代码

#includeint main(int argc, char **argv)

{

int i;

int a[5];

for(i=0;i<6;i++)

a[i]=0;

printf("hello word");

return 0;

}

在linux和windows上运行的结果是不同的。在windows上由于数组越界导致for进入死循环而没有输出,但在linux上却是有输出的,难道是Linux没有发生数组越界吗?并不是这样的。

先来看一下这段代码的栈数据i和数组a在windows上的内存分配图

4e0584e65465dc6bc88a83b074c259d0.png

从这张内存图中数组最后一个元素的地址和i的地址是连续的,于是当数组越界后会覆盖掉i地址上原来的数据,于是for就进如了死循环,程序无输出。

但是上述代码运行在linux系统(Fedora 23,Ubuntu 15.10 )上是会有输出,但是同样的也越界了于是分别查看了i和a[4]的地址:

0d99e2259e60d26ce8f1cae6107423db.png

用gdb的输出可以看到i的地址和a[4]的地址间有一段空余(此处为12字节的空闲),于是他的栈内存应该是这样的

cb65292aac2f8d9ed775f81f97586d9b.png

由上图可以看到在linux上有输出不是应为它没有越界,而是它越界不够厉害,地址还没越到i的地址上去,所以i保留了它原来的数据,for会终止。

f6f2010b107ee13689c5f155659f56d8.png

在许多次尝后发现数组和非数组数据之间总会有一段栈内存的空余来防止越界造成的不良后果。或许这就是linux 为了防止越界产生的不可预知错误所做的一点补救吧。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值