这个题在面试的时候被面过,当时给出的答案是比较两个本地变量的地址,面试官没有给出正确还是错误的答案,当时还以为答对了,今天突然看了一篇文章,发现错了,晕倒,错了大半年。
一:为什么会错?
编译器有各种各样的理由来乱排本地变量的顺序,按照使用频率等等,同时还要考虑段的问题,如果一个堆栈跨段时怎么办?等等
二:可能的解决方案:
比较函数的参数和本地变量,代码如下:
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上面堆栈是从堆分配的,因此最好还是参考你的工作平台的文档。
一:为什么会错?
编译器有各种各样的理由来乱排本地变量的顺序,按照使用频率等等,同时还要考虑段的问题,如果一个堆栈跨段时怎么办?等等
二:可能的解决方案:
比较函数的参数和本地变量,代码如下:
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上面堆栈是从堆分配的,因此最好还是参考你的工作平台的文档。