数组不同分配方式对比

  • 概述
  • 例子
    • 1、全局分配的数组
    • 2、栈分配的数组
    • 3、堆分配数组
  • 总结

概述

  • 本文例子均来自《IDA PRO 权威指南》第八章第一节
  • 阅读前需要掌握基本的汇编指令

例子

1、全局分配的数组

int global_array[3];int main() {int idx = 2;global_array[0] = 10;global_array[1] = 20;global_array[2] = 30;global_array[idx] = 40;
}


  • 全局变量存在.data或者.bss节内
  • 在使用ida反汇编的时候没办法知道数据到底是不是数组,要自己分析

2、栈分配的数组

int main() {int stack_array[3];int idx = 2;stack_array[0] = 10;stack_array[1] = 20;stack_array[2] = 30;stack_array[idx] = 40;
}

  • array[0](var_10,-10h)储存数组内第一个数的偏移量
  • 通过idx的赋值位置,可以分析出数组的大小,(10h-4h)/4h=3

3、堆分配数组

#include <stdlib.h>int main() {int *heap_array = (int*)malloc(3 * sizeof(int));int idx = 2;heap_array[0] = 10;heap_array[1] = 20;heap_array[2] = 30;heap_array[idx] = 40;
}


  • 不太明白书中说的为什么每次访问数组的时候都要进行一次array地址的读取,执行完之后array的地址应该是已经确定了的,频繁的读取[ebp+array]不知道为什么

总结

  • 都很容易看出每个元素大小
  • 在不知道源码的情况下并不能很快人出是数组

全局分配数组、栈分配数组、堆分配数组在IDA反汇编中的不同——《IDA权威指南》例子尝试相关推荐

  1. 哪个更快:堆栈分配或堆分配

    这个问题听起来很基础,但这是我与另一位与我合作的开发人员进行的辩论. 我一直在小心翼翼地在可能的地方分配东西,而不是堆分配东西. 他在和我说话,看着我的肩膀,并评论说这是不必要的,因为它们是相同的表现 ...

  2. 数据结构笔记(十三)-- 串的堆分配存储表示

    串的堆分配存储表示 一.堆分配存储概述 堆分配内存仍是一组地址连续的存储单元来存放串值字符序列,但是存储空间实在程序执行过程中动态分配而得.在C语言中,存在一个称为"堆"的自由存储 ...

  3. java中栈和堆都存哪些东西_java中栈内存与堆内存(JVM内存模型)

    java中栈内存与堆内存(JVM内存模型) Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中.哪些存储在栈中.内存中的 ...

  4. JS 中的 栈内存和堆内存

    栈内存 1.访问顺序 栈是一种先进后出的数据结构,栈内存是内存中用于存放临时变量的一片内存块. 它是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶,另一端称为栈底. 2.存储数据 一 ...

  5. 栈内存和堆内存的区别与原理

    目录 B站讲解视频地址 栈内存和堆内存的区别与原理 栈数据结构 堆数据结构 变量类型与内存的关系 基本数据类型 引用数据类型 从内存角度来看变量复制 基本数据类型的复制 引用数据类型的复制 栈内存和堆 ...

  6. 对于栈内存和堆内存的理解

    栈 1.和堆一样存储在计算机RAM中 2.栈是为执行线程留出的内存空间 3.栈附属于线程,因此当线程结束时栈被回收 4.线程被创建的时候,设置栈的大小 5.当用栈过多时会导致栈溢出(无穷次/大量的递归 ...

  7. 【性能优化】面试官:Java中的对象和数组都是在堆上分配的吗?

    写在前面 从开始学习Java的时候,我们就接触了这样一种观点:Java中的对象是在堆上创建的,对象的引用是放在栈里的,那这个观点就真的是正确的吗?如果是正确的,那么,面试官为啥会问:"Jav ...

  8. C++对象模型8——构造函数和析构函数中对虚函数的调用、全局对象构造和析构、局部static数组的内存分配

    一.构造函数和析构函数中对虚函数的调用 仍然以https://blog.csdn.net/Master_Cui/article/details/109957302中的代码为例 base3构造函数和析构 ...

  9. C/C++的内存分配?栈和堆的区别?为什么栈快?

    一个由 C/C++ 编译的程序占用的内存分为以下几个部分 : 栈区( stack ) --由编译器自动分配释放,存放为运行函数而分配的局部变量.函数参数.返回数据.返回地址等.其操作方式类似于数据结构 ...

最新文章

  1. HDU 3926 图的同构
  2. 使用Spring JUnit规则进行参数化集成测试
  3. apache服务器配置Net的实践
  4. 一个强大的图表库 -- ECharts
  5. 艾特肯法方程解matlab程序,牛顿迭代法matlab代码
  6. 排序算法lowb三人组-插入排序
  7. linux shell java 参数_java调用linux中的shell脚本传递参数并返回执行结果
  8. python 面向对象 类的内置方法
  9. 26章 OOP:宏伟蓝图
  10. kindeditor 编辑器手机访问默认为HTML编辑
  11. VS code,Live Server更改默认浏览器
  12. Android源码 --- BroadCast源码分析
  13. signature=9aadee6a3f882c84134bf5f6f04d2c93,Fw: Updated Scor Input Requirements
  14. 计算机视觉与深度学习基本环境安装
  15. [python复习8] 数据库mysql操作
  16. matlab中asc格式,matlab将图片转换成asc码txt文本格式 | 学步园
  17. 赠书 | 四大通证类型:价值创新的源头
  18. 百度离线地图示例之二:测距
  19. vmware 里的 rac install 的记录
  20. QT 杀毒软件(课设)

热门文章

  1. 【专业知识问答】问:发电机转子绕组匝间短路的危害、起因、处理要求和预防措施各是什么?
  2. 例4001 HTML解析
  3. Efm32TG11B调试
  4. 快手sig签名,python版,可用于快手关键字搜索结果采集
  5. 欧洲的tado温控器,与Nest的 5 处不同
  6. nmap操作系统检测_Nmap操作系统检测
  7. java百度地图路线规划_浅谈百度地图WEB开发中的四种路线规划
  8. Kalibr 之 Camera-IMU 标定 (总结)
  9. Unity3D游戏开发之Lua与游戏的不解之缘(上)
  10. iOS-OC-widget使用教程