我在採訪中被問及如何在不使用堆棧指針的情況下找到堆棧位置,並給出堆棧的上限和堆棧深度。我無法給出答案。後來我搜索了同樣的內容,但沒能找到一個。任何人都可以幫我找到答案。如何在沒有堆棧指針的情況下找到堆棧的當前位置?
0
A
回答
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)大。但是如果你打算編寫一個堆棧的代碼,你可以將它寫成動態的
相關問題
- 1. 如何找到當前的堆棧?
- 2. 堆棧幀和堆棧指針
- 3. 使用dwarf2獲取堆棧指針的堆棧指針值
- 4. ANDing堆棧指針
- 5. 在沒有System.Collections的情況下創建堆棧類
- 6. 在沒有堆棧的情況下創建NPE
- 7. Linux下的僞隨機堆棧指針?
- 8. C中有堆棧指針快嗎? (沒有間接但仍堆)
- 9. 如何在堆棧溢出發生之前看到堆棧?
- 10. 堆棧指針VS應用
- 11. 彙編堆棧指針AVR
- 12. 堆棧指針和分割
- 13. 初始化堆棧指針
- 14. 堆棧沒有在非標準位置找到C庫
- 15. 如何判斷指針是指向堆棧還是指向堆?
- 16. 如何在沒有獲得NPE的情況下在堆棧上彈出節點
- 17. 基指針和堆棧指針
- 18. 找出指針是指向堆棧,堆或程序文本嗎?
- 19. 返回指令堆棧中的指針
- 20. 以下情況下的數據結構如何? (最大堆棧)
- 21. 如何在沒有catch/try/raise的情況下展開(多級返回)堆棧?
- 22. 如何在沒有pstack和gdb的情況下獲得線程堆棧信息
- 23. 如何在沒有%rbp寄存器的情況下重新分配堆棧幀?
- 24. WebAssembly堆棧/堆棧指針初始化和內存佈局
- 25. 堆棧和隊列的使用情況?
- 26. 在x86上沒有幀指針的堆棧展開
- 27. 有沒有辦法在AWS cloudformation中配置嵌套堆棧的「堆棧名稱」?
- 28. 如何在不重置路由器堆棧的情況下重置頁面?
- 29. 如何獲得當前堆棧級別
- 30. 堆棧指針的值是多少?
它們與「上限」是什麼意思?難道他們希望你追蹤回報地址,並且真的對堆棧的底部有興趣嗎? – 5gon12eder
@ 5gon12eder upperbound意味着堆棧可以容納的最大元素 – LiorA
@LiorA我也這麼認爲,但是爲了解決這個問題,這個信息似乎並不是很有幫助。 – 5gon12eder