确定堆栈的增长方向

这个题在面试的时候被面过,当时给出的答案是比较两个本地变量的地址,面试官没有给出正确还是错误的答案,当时还以为答对了,今天突然看了一篇文章,发现错了,晕倒,错了大半年。
一:为什么会错?
编译器有各种各样的理由来乱排本地变量的顺序,按照使用频率等等,同时还要考虑段的问题,如果一个堆栈跨段时怎么办?等等
二:可能的解决方案:
比较函数的参数和本地变量,代码如下:
void func(char* ptr1){
  char* ptr2;
  if( ptr1 < ptr2 ){up}
  else {down}
}

一个改进是将参数声明为volatile,避免参数通过寄存器传递,还可以将本地变量声明为一个数组

void stack_growth(volatile char *function_parameter){
volatile char local [64];
if (&local [63] > function_parameter)
printf("up/n");
 else printf("down/n");
}

另外的方法可以是比较在堆上分配的对象的地址,这是因为一般情况下堆和堆栈是对着生长的,但是由于堆的分配方式等等是不定的,因此该方法实际没用。

最后需要明确的一点是,由于确定堆栈的生长方向是很大程度上依赖于具体的实现,例如在lisp上面堆栈是从堆分配的,因此最好还是参考你的工作平台的文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值