2010-02-12 87 views
3

可以在C中動態更改堆棧大小嗎?可以動態更改堆棧大小 - 如何?

如果是,如何?

+0

我不知道我理解你的問題。調用一個函數或者用局部變量輸入一個塊可以擴展堆棧,但看起來這不太可能是你正在尋找的答案。 – AProgrammer

+1

有一點注意:使用'alloca()'獲得當前函數中當前stacj的空間。 (@AProgrammer) – imacake

回答

-3

爲什麼你需要這樣做?它依賴於操作系統,並不是C本身直接參與的事情(儘管具體的連接器和運行時環境有不同的方式來管理這些事情的配置)。

你有什麼操作系統,你想達到什麼目的?

+1

這是我討厭的那種答案:「爲什麼有人會那樣做」。 如果您沒有答案,請保持沉默。他可能有理由問。我其實也有同樣的問題。答案當然是:google rlimit。而且我仍然沒有回答Windows ... 現在,回答你的問題:如果他必須實現交互式開發環境或語言解釋器,用戶可以輸入任意腳本來執行,該怎麼辦?如果腳本需要大量堆棧(遞歸的),那麼運行時系統應該支持它(捕獲堆棧溢出,更改限制並繼續) - 對嗎? – blabla999

+3

@ blabla999:我總是很高興有一個解釋,尤其是一個很好的解釋downvote。經過反思,這個「探索性問題」應該是一個評論。話雖如此,就信息內容而言,它就是你想的答案。底線是我試圖幫助這個過程 - 有時候我會通過投票並在問題評論中添加「cmon,更多詳細信息」來做到這一點,有時候我會通過給出一半的答案並繼續前進來做到這一點。但我很欣賞你的立場良好的基礎,並將此視爲對違約評論的更大推動 –

2

動態地,你是指代碼在執行時更改堆棧大小嗎? AFAIK,這是無法完成的。但是,您可以在運行應用程序之前設置堆棧大小。您可以通過在Linux中使用「ulimit -s」命令來完成此操作,該命令將設置該shell下執行的所有進程的堆棧大小。

對於windows,通過在項目屬性 - >鏈接選項 - >輸出 - >堆棧分配 - >預留中設置堆棧大小,可以在該項目的VC6中完成相同的操作。我不知道VC8,但這些選項可能是可用的。

0

一般來說,這是無法穩健完成的,因爲需要爲堆棧保留地址空間。如果對象已經被分配到堆中,並且地址在新的所需堆棧範圍內,那麼你會遇到很大的麻煩。在內存少於地址空間的系統上,這可能是可能的,但我懷疑你會看到許多允許它的系統。 C不需要也不支持任何這樣的機制。

0

不,這不在C的範圍內。

3

它取決於您使用的操作系統。

在Unix/Linux上,您可以使用POSIX syscall setrlimit()作爲RLIMIT_STACK資源。

查看man setrlimit瞭解詳情。

1

在Linux下的單線程程序中,堆棧會自動增長,直到它崩潰到內存空間中的其他地方。這通常是堆,在32位系統上,這意味着您通常可以擁有幾GB的堆棧。

在一個多線程程序中,這通常是不可能的,因爲另一個線程的堆棧將會被阻塞。

您可以在創建新線程時控制堆棧大小,但這通常是一個壞主意,因爲它依賴於體系結構,因此任務需要多少堆棧。

這是相當低層次的東西,主要由您的C庫/線程庫控制。圍繞你的危險:)

+0

從技術上講,利用虛擬內存,應該有可能移動事物以爲堆棧增長創造空間。因此,即使多線程程序也支持動態堆棧。 – doc