美文网首页
理解内存连续问题

理解内存连续问题

作者: 安森老叔叔 | 来源:发表于2020-04-25 11:36 被阅读0次

int main(int argc, char* argv[]){
    int i = 0;
    int arr[3] = {0};
    for(; i<=3; i++){
        arr[i] = 0;
        printf("hello world\n");
    }
    return 0;
}
  1. 该段代码会无限循环打印hello world,而不是打印三次。
  2. 涉及到函数调用的栈桢结构细节(操作系统或计算机体系结构的教材应该会讲到)。
  3. 函数体内的局部变量存在栈上,且是连续压栈。在Linux进程的内存布局中,栈区在高地址空间,从高向低增长。变量i和arr在相邻地址,且i比arr的地址大,所以arr越界正好访问到i。当然,前提是i和arr元素同类型,否则那段代码仍是未决行为。
  4. 死循环的问题跟编译器分配内存和字节对齐有关。数组3个元素 加上一个变量i 。4个整数刚好能满足8字节对齐(改成7个整数也会死循环) 所以i的地址恰好跟着a2后面 导致死循环。。如果数组本身有4个元素 则这里不会出现死循环,因为编译器64位操作系统下 默认会进行8字节对齐 变量i的地址就不紧跟着数组后面了。
  5. 可以百度搜索“大端小端”;intel 使用的小端模式,数据字节的高低位与内存地址的高低位一致。栈中数据存放是【由高地址到地地址】,所以 压栈顺序为 i ->a[2]->a[1]->a[0],出栈顺序相反,a[3]取到的值为i。

相关文章

  • 理解内存连续问题

    该段代码会无限循环打印hello world,而不是打印三次。 涉及到函数调用的栈桢结构细节(操作系统或计算机体系...

  • Linux内存管理-内存碎片的终极解决方案

    内存碎片问题 频繁地请求和释放不同大小的内存,必然导致内存碎片问题的产生,结果就是当再次要求分配连续的内存时,即使...

  • 内存优化笔记

    内存性能对比 内存分配以及问题出现区域 内存造成的两个主要问题:异常、卡顿 内存理解误区 内存占用越少越好应用是否...

  • 如何避免内存碎片

    频繁地请求和释放不同大小的内存,必然导致内存碎片问题的产生,结果就是当再次要求分配连续的内存时,即使整体内存是足够...

  • 如何避免内存碎片

    频繁地请求和释放不同大小的内存,必然导致内存碎片问题的产生,结果就是当再次要求分配连续的内存时,即使整体内存是足够...

  • 数组

    数组特性: 基于特性2:连续的内存空间和相同类型数据: 理解:随机访问特性(根据下标进行访问) 理解:插入操作(注...

  • Android性能优化之内存泄漏

    内存泄漏:内存单元使用完成后未释放,未回收。理解强弱引用和gc垃圾回收机制后,会更好的理解内存泄漏问题。 在目前的...

  • 基于Java 的内存分析

    在J2SE中,通过进行内存分析,可以让我们更好的理解程序在内存中的内存分配问题,也能让我们更好的理解我们的代码...

  • C/C++内存对齐

    在面试或工作中,经常会遇到内存对齐的问题。这里结合我的理解谈一谈对内存对齐的理解。 1. 为什么要内存对齐,不对齐...

  • Java内存模型原理,你真的理解透彻了吗?

    内存模型产生背景 在介绍 Java 内存模型之前,我们先了解一下物理计算机中的并发问题,理解这些问题可以搞清楚内存...

网友评论

      本文标题:理解内存连续问题

      本文链接:https://www.haomeiwen.com/subject/esvhwhtx.html