鑒于 C 中函式內部的區域變數在函式被呼叫后被推入堆疊的事實(在推入傳遞給函式的變數之后),在堆疊緩沖區溢位之前對所述變數的數量是否有任何限制?或者該限制僅由確定的主機具有的 RAM 量給出?
我試圖通過創建一個 4,6gb .C 檔案來測驗這一點,其中一個函式具有 25000*13 個變數宣告并初始化為 0。所述函式在 main() 內被呼叫,但它編譯得很好(使用 -O0)和它沒有崩潰。
編輯:號碼錯了!我的錯。
uj5u.com熱心網友回復:
例如根據 C 標準(5.2.4.1 翻譯限制)
1 實作應能夠翻譯和執行至少一個程式,該程式包含以下每一項限制的至少一個實體:
— 一個翻譯單元中有 4095 個外部識別符號
— 在一個塊中宣告了 511 個具有塊作用域的識別符號
uj5u.com熱心網友回復:
主執行緒的默認堆疊大小在 macOS 上為 8 MiB(來自ld手冊頁),在 Linux 上為 2 MiB(根據此處的--stack開關),在 Windows 上為 1 MiB(根據本頁)。在程式中創建的其他執行緒可能具有較小的堆疊。(注意:參考的各種來源使用“MB”或“Mb”;我在背景關系中將這些解釋為 1,048,576 位元組 = 1 MiB。)
將程式鏈接到可執行檔案時,可以請求不同的堆疊大小。
函式將堆疊空間用于各種事情,包括傳遞引數、建立用于拋出例外的堆疊幀、有時是除錯資訊和臨時作業空間,因此用于堆疊的記憶體量與變數數量之間沒有直接關系可以定義。
uj5u.com熱心網友回復:
由于您沒有詢問最低要求,我將寫有關 C 標準的內容
現在的現代合規編譯器沒有設定任何限制(Microsoft 不計算,因為它不合規)。您受到可用計算機資源的限制。
工具鏈的另一部分(聯結器、物件和可執行檔案限制等)可能會設定一些額外的限制,但現代主線編譯器通常沒有任何限制。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/373364.html
上一篇:我需要復制字串,但它不起作用
下一篇:C:列印最長公共前綴
