函数调用过程中保存返回地址
保存堆栈框架
保存在sort函数中用到的寄存器的值
sort函数中为局部变量分配空间
编译器不同,对函数操作的情况会有差别,
代码的实现当然要依赖编译器和cpu的设计...
----------------解决方案--------------------------------------------------------
好像很危险。。。具体是满递增,满递减,空递增,空递减,到底是哪一种栈要先确定吧
----------------解决方案--------------------------------------------------------
这个栈是由80x86cpu内部的ss 和esp或sp 寄存器支持的,
int数组array 是局部变量它的内存空间就是在栈上,
在sort函数中分配1个int型变量a,这个变量a和数组array都在这个cpu硬件支持的栈段上,
用a的地址加上 一定的偏移量就可以寻找到数组array中每个元素,
至于上边朋友说的vc6.0,它在生成代码的时候 变量a和数组array之间的偏移值不同于tc,
至于偏移是多少按照调用函数的过程自己计算,
在vc6.0中 把上次代码中的 p=p+4//修改成 p=p+22 ,我的机器上是能够访问到 数组a的第1个元素的.
----------------解决方案--------------------------------------------------------
看了楼上的各位后,我发现我还差很远,很远,很远,很远,很远…………
----------------解决方案--------------------------------------------------------
重新写了个..........
[CODE]
#include <stdio.h>
void sort(void);
int main()
{
int array[]={45,56,234,1,34,23,2,3};
sort();
{
int i; /*这儿的复合语句只是检验下数组array已经被sort()函数排序修改*/
for(i=0;i<8;i++)
printf("%d ",array[i]);
/*tc下请加getch()*/;
}
return 0;
}
void sort (void)
{
int index;
int *p=&index;
int b[]={45,56,234,1,34,23,2,3};
while(*p!=b[0]||p==b)
p++;
do{
index=0;
while(b[index]==p[index])
{
index++;
if(index==8)
break;
}
++p;
}while(index!=8);
--p;
{
int i,j,mid;
for(i=0;i<7;i++)
for(j=i+1;j<8;j++)
{
if(p[i]>p[j])
{
mid=p[i];
p[i]=p[j];
p[j]=mid;
}
}
}
}
----------------解决方案--------------------------------------------------------
这个tc和 vc都应该可以了把
----------------解决方案--------------------------------------------------------
楼上的估计可以,这个办法倒是挺不错的,不需要弄明白那些复杂的知识就可以做到。
不过如果恰好index的地址和数组第一个元素的地址之间的差距不是sizeof(int)的整数倍,这样就不行了吧。
----------------解决方案--------------------------------------------------------
我有一个地方不明白``` oaoaoaaoao在sort函数声明了住函数的数组```
要是住函数是通过人为输入``而不是直接赋值``那么sort函数的数组又怎么定义呢``或者说又怎么半呢?
----------------解决方案--------------------------------------------------------
很想学习一下,不过我觉得这样题目没有意义,本来带参数是很容易实现的嘛.
----------------解决方案--------------------------------------------------------
这里有个前提:这个是一个题目,不允许修改主函数,所以需要用这么复杂的办法,实际编程的话,根本没人这么无聊。
所以如果可以假设数组通过人为输入,那就可以假设把数组设为全局变量了。如果非要做一个通用的解法,估计不写汇编是不行的,而且代码量也不少
----------------解决方案--------------------------------------------------------