回答
爲什麼你需要這樣做?它依賴於操作系統,並不是C本身直接參與的事情(儘管具體的連接器和運行時環境有不同的方式來管理這些事情的配置)。
你有什麼操作系統,你想達到什麼目的?
這是我討厭的那種答案:「爲什麼有人會那樣做」。 如果您沒有答案,請保持沉默。他可能有理由問。我其實也有同樣的問題。答案當然是:google rlimit。而且我仍然沒有回答Windows ... 現在,回答你的問題:如果他必須實現交互式開發環境或語言解釋器,用戶可以輸入任意腳本來執行,該怎麼辦?如果腳本需要大量堆棧(遞歸的),那麼運行時系統應該支持它(捕獲堆棧溢出,更改限制並繼續) - 對嗎? – blabla999
@ blabla999:我總是很高興有一個解釋,尤其是一個很好的解釋downvote。經過反思,這個「探索性問題」應該是一個評論。話雖如此,就信息內容而言,它就是你想的答案。底線是我試圖幫助這個過程 - 有時候我會通過投票並在問題評論中添加「cmon,更多詳細信息」來做到這一點,有時候我會通過給出一半的答案並繼續前進來做到這一點。但我很欣賞你的立場良好的基礎,並將此視爲對違約評論的更大推動 –
動態地,你是指代碼在執行時更改堆棧大小嗎? AFAIK,這是無法完成的。但是,您可以在運行應用程序之前設置堆棧大小。您可以通過在Linux中使用「ulimit -s」命令來完成此操作,該命令將設置該shell下執行的所有進程的堆棧大小。
對於windows,通過在項目屬性 - >鏈接選項 - >輸出 - >堆棧分配 - >預留中設置堆棧大小,可以在該項目的VC6中完成相同的操作。我不知道VC8,但這些選項可能是可用的。
一般來說,這是無法穩健完成的,因爲需要爲堆棧保留地址空間。如果對象已經被分配到堆中,並且地址在新的所需堆棧範圍內,那麼你會遇到很大的麻煩。在內存少於地址空間的系統上,這可能是可能的,但我懷疑你會看到許多允許它的系統。 C不需要也不支持任何這樣的機制。
不,這不在C的範圍內。
它取決於您使用的操作系統。
在Unix/Linux上,您可以使用POSIX syscall setrlimit()
作爲RLIMIT_STACK
資源。
查看man setrlimit
瞭解詳情。
在Linux下的單線程程序中,堆棧會自動增長,直到它崩潰到內存空間中的其他地方。這通常是堆,在32位系統上,這意味着您通常可以擁有幾GB的堆棧。
在一個多線程程序中,這通常是不可能的,因爲另一個線程的堆棧將會被阻塞。
您可以在創建新線程時控制堆棧大小,但這通常是一個壞主意,因爲它依賴於體系結構,因此任務需要多少堆棧。
這是相當低層次的東西,主要由您的C庫/線程庫控制。圍繞你的危險:)
從技術上講,利用虛擬內存,應該有可能移動事物以爲堆棧增長創造空間。因此,即使多線程程序也支持動態堆棧。 – doc
- 1. 是否可以動態更改最大Java堆大小?
- 2. 如何更改可用於Emacs的堆棧大小?
- 3. GMAKE更改堆棧大小限制
- 4. 更改全局堆棧大小,GNU Prolog
- 5. 在C#中更改堆棧的大小
- 6. 如何檢測活動堆棧是否爲空以及活動堆棧大小?
- 7. 可變堆棧大小
- 8. 更改堆大小
- 9. 我可以更改UINavigationController viewControllers堆棧嗎?
- 10. 如何更改託管executable.net的默認堆棧大小
- 11. 如何更改.NET程序的堆棧大小?
- 12. 如何在C++中實現動態調整大小的堆棧?
- 13. 如何動態調整大小的堆棧視圖
- 14. Android堆棧大小
- 15. Linux堆棧大小
- 16. 如何找到最大堆棧大小?
- 17. 如何動態更改舞臺大小
- 18. 在哪裏創建動態大小數組? (堆棧或堆)
- 19. 堆棧= java.lang.StackOverflowError的:堆棧大小8MB
- 20. 動態更改JPanel大小
- 21. Tomcat7堆棧大小很小
- 22. 我可以聽活動堆棧中的更改嗎
- 23. FreeRTOS STM32鏈接器堆棧大小vs任務堆棧大小
- 24. JVM最大堆大小可以動態變化嗎?
- 25. 動態堆棧
- 26. 更改jvm堆大小 - jgrasp
- 27. 如何在Microchip的C18上使用更大的堆棧大小?
- 28. 是否可以刪除最大調用堆棧大小?
- 29. 是否可以使用D3動態更改div的大小?
- 30. 如何增加scala堆棧大小?
我不知道我理解你的問題。調用一個函數或者用局部變量輸入一個塊可以擴展堆棧,但看起來這不太可能是你正在尋找的答案。 – AProgrammer
有一點注意:使用'alloca()'獲得當前函數中當前stacj的空間。 (@AProgrammer) – imacake