2020-12-12(c++多维数组的反编译观察)
发布日期:2021-05-07 12:06:33 浏览次数:23 分类:技术文章

本文共 1003 字,大约阅读时间需要 3 分钟。

c++一维数组的话,大家都知道,就把数组内容存放在相应的内存地址所对应的地址单元中,举个例子:nArray[4]={1,2,3,4}存储如下:在这里插入图片描述

但c++二维数组存储方式大家想过有什么不同的吗?nArray[2][2]={1,2,3,4}存储如下
在这里插入图片描述
其实大家看了之后,是不是感觉都一样呀。。。唉,其实呢,就不存在什么二维数组,三维数组,四维数组什么的,都是线性存储。
总结一句话来说,也就是(二维数组是由n个一维数组构成,三维数组是由n个二维数组构成,四维数组是由n个三维数组构成……)以此类推,只不过呢,他们各自指针+1后 的值不一样(即步长不一样)
跟大家慢慢解释如何数组拆分理解:
整型二维数组 int nArray[2][3]可拆分为三部分:
数组的首地址:nArray
一维元素类型:int [3]

  • 类型:int
  • 元素个数:[3]
    一维元素个数:[2],此下标值记作i
    大家在这里会不会有点难区分这两个个数呢?我来解释一下:
    元素个数[3]:这里指的是拆分出来的 一维数组里元素个数为3个
    一维元素个数:这里指的是这个二维数组可以拆分出 2 个一维数组

则不管我们计算几维数组的元素偏移(即寻址)时,可得公式:

数组首地址+sizeof(type[j]) 二维下标值 +sizeof (type ) 一维下标值**
这个公式什么意思呢,我来举个例子:

例如int a[5][6]的二维数组中,我要找到int a[2][3]的偏移时:

数组首地址 + sizeof (int[6]) * 2 +sizeof(int) 3
近一步=数组首地址+sizeof(type)
(2*6+3)
(这个可以类比成公式哦,二维三维四维更多都行滴)
在这里插入图片描述

此汇编代码 lea eax ,[ecx+edx*2]足以证明一切

切记切记,别把一维下标值和二维下标值理解反了,这里切记要理解,不能背,背的话那就失去了反编译的意义。

所以当我们遇到三维数组时,怎么理解呢?

int a[4][5][6]中去寻找 int a [2][3][4]的偏移,下方评论区写出你的答案吧?
(首先把三维化成二维,再把二维分为一维)
也就是这个int a[2][3][4]包含了 2个 int [5][6]的偏移地址 +3个int [6]的偏移地址 + 4个int 的偏移地址,然后我们近一步把这个二维化成一维,最后把它们相加,理解?

大家评论区见吧

上一篇:c++对象长度之空类(1)
下一篇:DMB DSB ISB 简介

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年03月25日 21时12分05秒