多维数组

多维数组汇编解析

学过C语言的都会了解局部变量是没有内存单元的,而在这里的x是全局变量是有内存单元的,我们下面定义的Function函数我们也可以看成是全局变量,如果在main函数中使用要给它强制类型转换。。。
C语言:在这里插入图片描述
接下来我们看一下我们将Function函数看成全局变量它会变成什么?
C语言:
在这里插入图片描述
根据这个输出结果我们可以把这个输出结果当成是地址。

接下来我们看看数组越界了为什么还能运行呢?
C语言:
在这里插入图片描述
这段代码是可以编译通过的。。
汇编:
在这里插入图片描述
上面的汇编代码是函数的准备部分和分配内存空间,以及恢复现场和回复堆栈。。。

C语言:
在这里插入图片描述
我们会看到明显arr[6]是越界的,但是在这里是可以运行的。。。。
我们来看看汇编代码:
在这里插入图片描述
我们会看到
在这里插入图片描述
我们将0x12345678存到了ebp+4这个存储空间去了,如果了解堆栈图的人会知道,当前这个ebp+4是pop到eip当中的,变成完成当前这个Function函数之后执行的eip的值,这快也可称为函数的返回地址,这里跟call指令相同。。。

通过上面的例子我们了解到,如果数组越界,他会读取堆栈里的其它数据。。

这回我们看看换成函数的方式
C语言:
在这里插入图片描述
看看这个汇编代码:
在这里插入图片描述
这里的offset可以理解为标识的意思,标识这Helloworld是个地址
正常Helloworld是
在这里插入图片描述
我们接下来看下一数组
C语言:
在这里插入图片描述
汇编:
在这里插入图片描述
接下来是二位数组:
C语言:
在这里插入图片描述
汇编:
在这里插入图片描述
我们会看到二维数组的汇编跟一位数组的汇编存储方式是一样的。。。

现在我们来看三位数组:
例如:arr[5][4][3],现在我们找arr[1][2][1]那它在编译器中是如何寻找的呢???
ta会143+ 23+1(如果是二维数组arr[3][4],我们要找arr[1][2]ta的计算方式就是14+2)
arr[n][m][k][w][r]:arr[2][3][4][2][2],那么他的计算公式就是:2mkwr+3kwr+4wr+2r+2

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值