2016-09-27 70 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)大。但是如果你打算編寫一個堆棧的代碼,你可以將它寫成動態的