2014-05-11 54 views
-4

相關文章:Delete folder with items指向struct的指針比指定更多?

如何使指針數組中的指針可用於比指定更多的指針?對於ftw/ftwn的學習工具,我重寫了ftwn相關文章(上面)中的ftwn解決方案。基本上使用ftw回調來填充包含文件名,每個文件的類型和深度的結構數組。然後,文件刪除從maxdepth開始,直到刪除文件,然後沿途刪除目錄。這是一個測試,所以printf顯示unlinkrmdir應該被調用,刪除命令永遠不會執行。

結構數組的存儲嘗試了3種不同的方式。 (1)靜態指定可用指針的數量struct _rmstat *rmstat [100];(ftw'nopenfd'設置爲200),(2)動態分配struct _rmstat **rmstat;,最後(3)將信息添加到鏈接列表。測試靜態分配時,我專門選擇了少於100個文件的測試目錄,然後使用多於100個文件的目錄,導致失敗

令我驚訝的是,靜態分配的測試會定期處理包含超過100個文件的目錄,最多可達450個!這怎麼可能?我認爲靜態分配struct _rmstat *rmstat [100];應該保證在嘗試101st結構分配時發生段錯誤(或類似的核心轉儲)。在堆棧/堆分配中,gcc中是否有這樣的功能?或者,這只是「未定義」行爲的一部分嗎?與ftw,我設置'nopenfd'大於可用的結構指針,所以我不認爲這是ftw限制文件描述符和關閉/重新打開文件的結果。

我已經搜索,但找不到解釋如何得到比指定更多的指針。這裏有人知道這會發生嗎?

test program source可用。 它是安全的 - 它刪除任何東西,只是與printf打印。搭建:gcc -Wall -o rmftws rmdir-ftw-static.c感謝您提供的任何見解。

+1

相關:http://stackoverflow.com/q/2397984/951890 –

回答

0

超出數組邊界只會導致未定義的行爲。如果它出現故障但它不需要這樣做會很好。

就具體問題而言 - 編譯器已經要求系統分配一個段來包含靜態數據,並告訴它它有多大。當它進行分配時,系統可能會過度分配存儲空間,通常達到頁面邊界。

+0

Vaughn,DrC和DNT,答案和鏈接都很棒。我沒有多少關於未指定,未定義和實現定義行爲之間的區別。在這種情況下,不是簡單地回答「它做了這個虛擬的......」,而是當你看到一個你知道代碼的完整執行的情況時,它更多的是「會發生什麼」的例子。超過預先設定的限制,本應該受到保護。行爲將簡單地是未定義的。我認爲這樣做。我運行了多臺機器的代碼 - 具有各種未定義的結果。 –

0

在這樣的數組中聲明100個指針並不總是保證段錯誤。如果你使用比數組大小更多的指針,它保證的是內存覆蓋。但是,如果被覆蓋的內存屬於你聲明的其他變量,它們的值將被丟棄,但是你不會在那裏出現錯誤,然後,直到後來在你的代碼中,你嘗試使用你存儲在這些變量中的任何值,在這種情況下,您的代碼可能會行爲不當,但不會崩潰,或者可能會在某些時候崩潰,但出於與覆蓋初始數組不明顯相關的原因。

在使用該數組的第101個位置時,您可能立即崩潰的一種情況是,如果該數組恰好在當前數據部分的確切末尾由編譯器分配,然後下一個被寫保護。但這是一個編譯器和操作系統控制的問題。