2013-02-28 49 views
0

由於malloc返回NULL,有沒有什麼辦法來檢測使用VLA的堆棧內存不足?VLA的內存可用於海灣合作委員會

+1

出現堆棧錯誤。如果你認爲這個數字可能不合理,不要賭博;使用'malloc()' – WhozCraig 2013-02-28 09:32:13

+0

「如果你不得不問,你買不起。」 – 2013-02-28 14:22:42

回答

1

C中沒有任何東西可以保證聲明VLA或檢查內存使用失敗的成功。對於任何自動對象聲明,VLA與否都是如此。

+0

感謝您的回答,當沒有足夠的空間存儲自動對象時,會發生什麼情況?程序無法啓動,因爲運行時知道所需的空間?它開始但崩潰? (請原諒我的英文不好) – 2013-02-28 10:09:27

+0

@DavidRF通常在聲明對象後,它會在進入函數後不久就開始崩潰(例如分段錯誤)。但它可能做任何事情,因爲我們處於未定義行爲的領域。 – ouah 2013-02-28 10:12:42

1

malloc()檢查堆,VLAs工作增加堆棧大小。如果malloc()返回NULL可能是您的堆棧已被填充。

正如WhozCraig指出的那樣,不要與VLA賭博。如果數組大小很大 - 請使用malloc()

2

你可以希望發生崩潰,但最糟糕的情況是,事情看起來會起作用,最終你會寫入其他內存。默認情況下,至少gcc不會生成驗證內存是否可用的代碼(儘管它有一個選項),所以足夠大的VLA可能會在任何地方結束。在MacOS上,你只需要一個線程中的0.5MB VLA來意外地寫入其他線程的堆棧。 Linux上10MB。

如果您不能保證VLA很小(小於一頁或兩頁),請不要使用它。

相關問題