多维数组

 ̄綄美尐妖づ 提交于 2020-02-01 23:07:38

多维数组

学过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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!