2016-09-27 182 views
0

我在采访中被问及如何在不使用堆栈指针的情况下找到堆栈位置,并给出堆栈的上限和堆栈深度。我无法给出答案。后来我搜索了同样的内容,但没能找到一个。任何人都可以帮我找到答案。如何在没有堆栈指针的情况下找到堆栈的当前位置?

+0

它们与“上限”是什么意思?难道他们希望你追踪回报地址,并且真的对堆栈的底部有兴趣吗? – 5gon12eder

+0

@ 5gon12eder upperbound意味着堆栈可以容纳的最大元素 – LiorA

+0

@LiorA我也这么认为,但是为了解决这个问题,这个信息似乎并不是很有帮助。 – 5gon12eder

回答

2

只需在堆栈上创建一个变量(即使用“自动存储”)并获取其地址。

void f() { 
    int x; 
    printf("Current stack position: %p\n", &x); 
} 
+1

这是一个答案,但我觉得这不是他们指导他的东西你没有使用给出的数据:stack upperbound,它是深度(必须定义井深) – LiorA

0

我认为这是一种聆听您要提供的几种解决方案的方法。 因此,让我们开始为int的完全指针堆栈:

struct stack{ 
    int *pos; 
    int *start; 
    int *end; 
} 
struct stack new_stack(size_t size) 
{ 
    struct stack * res=malloc(sizeof(struct stack)); 
    res->start=malloc(sizeof(int)*size); 
    res->pos=res->start; 
    res->end=res->start+size-1; 
} 

比位置由给:

return res->pos-res->start; 

但我认为这是vorbidden; 因此,让我们定义一个指数(这不是指针):

struct stack{ 
    int ix; 
    int *array; 
    int n; 
} 
struct stack *new_stack(size_t size) 
{ 
    struct stack * res=malloc(sizeof(struct stack)); 
    res->array=malloc(sizeof(int)*size); 
    res->ix=0; 
    res->n=size; 
    return res; 
} 

//you return 
return res->ix; 

其他的解决方案是一个无效值的占位符。但是每次你都应该得到整个阵列的时候都是哑巴。 (它就像空终止字符串) 否则,如果这两个答案不满足正确答案的地方是“这是不可能的” 只有在数组声明为静态数组[100]时,堆栈upperbound才有可能。 比sizeof(array)/ sizeof(* array)大。但是如果你打算编写一个堆栈的代码,你可以将它写成动态的