请教大家一下ARM局部数组入栈顺序问题

[复制链接]
4588|5
 楼主| lhshine 发表于 2007-6-4 11:20 | 显示全部楼层 |阅读模式
ARM, TE, AI
ARM为递减堆栈,局部变量存放在栈中。那么如果我的程序中有个局部变量数组,INT32U&nbsp;TEMP[16];&nbsp;<br />int8u&nbsp;main&nbsp;()<br />{<br />INT32U&nbsp;TEMP[16];&nbsp;<br />INT32U&nbsp;*p1=&TEMP[0];&nbsp;<br />INT32U&nbsp;*p2=&TEMP[15];&nbsp;<br /><br />}&nbsp;<br />虽然肯定知道p2=p1+15,但是为什么p2的值高于p1?局部变量放在堆栈中,堆栈不是递减的吗?如果是TEMP[0]先入栈,他的地址应该高于TEMP[15],难道是TEMP[15]先入栈?<br />可能是我哪里理解错了,恳请大家多多指教,谢谢!
HWM 发表于 2007-6-4 12:43 | 显示全部楼层

有必要去关心指针的具体数值吗?

  
djyos 发表于 2007-6-4 16:53 | 显示全部楼层

注意软件的可移植性

&nbsp;&nbsp;&nbsp;&nbsp;如果你的程序与编译器如何安排局部数组在栈中的存储方式有关,那么程序的可移植性就存在问题。<br />首先,即使相同的编译器,它只要遵守ansi&nbsp;c的标准就可以了,从来不会保证以后的升级版本不会改变这个存储顺序。<br />其次,如果改变编译器,天知道新编译器如何使用栈的。<br />再次,如果你移植程序到别的cpu,问佛祖吧!<br /><br />所以,最好不要关心局部数组的存储方式为妙,当作学习研究,长点见识倒是个好注意。
平常人 发表于 2007-6-5 22:14 | 显示全部楼层

不管是局部数组还是全局数组,数组分量在内存中的顺序永

<font color=#FF0000>真讨厌这种一个帖子到处发的习惯,看到4楼的回答有歧义,所以再来讨论一下。</font><br /><br />数组分量永远是下标小的在低地址端,下标大的在高地址端,即<br />&nbsp;&nbsp;当x&gty时&nbsp;&nbsp;=〉&nbsp;&temp[x]&nbsp;&gt&nbsp;&temp[y]<br /><br />否则当用指针访问这个数组时,指针的++和--操作就没有意义了。这与移植无关。<br /><br />但不同数组间的关系是没有一定的,是与具体的编译器和链接器的实现有关;依赖不同数组间的关系写的程序,可移植性较差。
lishuanghua 发表于 2007-6-5 22:36 | 显示全部楼层

2楼说得对,局部变量不是被压入堆栈,它只是占用堆栈空间而

  
djyos 发表于 2007-6-6 14:57 | 显示全部楼层

多谢平常人指正

&nbsp;&nbsp;&nbsp;&nbsp;为了与P++操作兼容,数组确实不可能倒序排列。<br />&nbsp;&nbsp;&nbsp;&nbsp;有一个搞笑的问题,如果有一个捣蛋的编译器,把P++操作也倒过来,把数组排列也倒过来,结构也由高地址开始分配,编程世界会编程怎样?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

6

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部