linux与windows栈内存分配区别

在linux和windows上运行的结果是不同的。在windows上由于数组越界导致for进入死循环而没有输出,但在linux上却是有输出的,难道是Linux没有发生数组越界吗?并不是这样的。
先来看一下这段代码的栈数据i和数组a在windows上的内存分配图

从这张内存图中数组最后一个元素的地址和i的地址是连续的,于是当数组越界后会覆盖掉i地址上原来的数据,于是for就进如了死循环,程序无输出。
但是上述代码运行在linux系统(Fedora 23,Ubuntu 15.10 )上是会有输出,但是同样的也越界了于是分别查看了i和a[4]的地址:

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

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

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

(0)

相关推荐

  • 一个小小指针,竟把Linux内核攻陷了!

    来自公众号:编程技术宇宙 怎样攻进操作系统内核? 这是一个很有意思也很硬核的问题. 黑客通过应用程序的漏洞(如Java.PHP.Apache.IE.Chrome.Adobe.office等)获得执行代 ...

  • Linux 写时复制机制原理

    在 Linux 系统中,调用 fork 系统调用创建子进程时,并不会把父进程所有占用的内存页复制一份,而是与父进程共用相同的内存页,而当子进程或者父进程对内存页进行修改时才会进行复制 -- 这就是著名 ...

  • 这是什么骚代码,我服了!!!

    神秘代码 今天给大家看个有意思的东西! 不仅有意思,还能学到知识. 话题从两行(准确的说是一行)神奇的代码聊起: // main.c #include <stdio.h> int main ...

  • 【链表3】动态内存分配

    文/Edward 这一小节是为了讲述第2小节链表而做的只是铺垫.在9.2节中,我们通过一种非常朴素的方式来为大家展示了"链式"数据结构的基本方法,即,我们先定义好一个结构体存储类型 ...

  • 【C语言更新】指向数组的指针

    文/Edward 前面我们在讲述数组的时候曾经说过,对于数组内部元素的引用方式主要有两种,一种就是使用方括号"[ ]"的下标索引,另一种就是之前提到过,但是没有细致讲述的指针引用. ...

  • 一文读懂 Linux 内存分配全过程

    在<你真的理解内存分配>一文中,我们介绍了 malloc 申请内存的原理,但其在内核怎么实现的呢?所以,本文主要分析在 Linux 内核中对堆内存分配的实现过程. 本文使用 Linux 2 ...

  • Linux和Windows哪个系统好?区别介绍!

    Linux.Windows想必大家都知道,是非常受欢迎的两个操作系统,也有不少人在疑惑到底该选择Linux还是Windows呢?Linux与windows对比有什么优势呢?我们来看看吧. 1.Linu ...

  • (1条消息) linux内核的内存分配函数

    作用 函数 devm_kzalloc() 和kzalloc()一样都是内核内存分配函数,但是devm_kzalloc()是跟设备(device)有关的, 当设备(device)被detached或者驱 ...

  • Linux 内存分配流程及 kmalloc 解析

    上一次咱们分析了 Linux 的启动流程和初始化流程,今天主要分析一下内存方面的初始化和常见的内存分配方式. 在 start_kernel 内核初始化函数中,一共调用 86 个函数去初始化,其中有一个 ...

  • C和指针之动态内存分配malloc、calloc、realloc简单使用和区别

    C和指针之动态内存分配malloc、calloc、realloc简单使用和区别

  • Linux内存分配机制

    原文:https://blog.csdn.net/gfgdsg/article/details/42709943 Linux 的虚拟内存管理有几个关键概念: 1.每个进程都有独立的虚拟地址空间,进程访 ...

  • Linux on Windows: This new upgrade allows you to run graphical apps simply and effectively

    由Simon Bisson在软件中2021年4月23日,太平洋标准时间上午4:20 微软已经发布了其用于WSL 2的图形工具的预览版,它出奇的好. 首次发布将近一年后,微软终于在Windows子系统L ...

  • 解读各种内存分配函数的差别

    今天我们来讲讲几种容易混淆的内存分配函数的区别,它们分别是:SHGetMalloc, SHAlloc, CoGetMalloc, 和CoTaskMemAlloc. 让我们先从简单的开始吧. 首先,Co ...

  • c++动态内存分配

    下面随笔是关于c++动态内存分配. 动态申请内存操作符 new new 类型名T(初始化参数列表) 功能:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值. 结果值:成功:T类型 ...