2012-02-15 69 views
2

我已經讀過calloc(malloc + init)有時會失敗初始化數組與零字節(但仍然會返回指向malloc'ed數組的指針)。但在documentation它沒有指定它會返回NULL,有沒有一種方法來確保數組被初始化爲零(更好然後去數組),如果沒有calloc超過malloc的優勢是什麼?我怎麼能知道,如果calloc未能初始化

+0

無論是[Linux手冊頁](http://linux.die.net/man/3/calloc),[MSDN手冊頁](http://msdn.microsoft.com/en-us/library /3f8w183e(v=vs.100).aspx)或[POSIX手冊頁](http://pubs.opengroup.org/onlinepubs/9699919799/functions/calloc.html)提到了這種情況。你在哪裏讀過關於它沒有設置內存的問題? – 2012-02-15 08:26:45

+0

_「如果函數未能**分配請求的內存塊,則返回一個NULL指針。」_ **分配**不是** init ** http://www.cplusplus.com/reference/ clibrary/cstdlib/calloc/ – 2012-02-15 08:31:50

+0

@samray:C標準對此非常一致,如果它沒有描述庫函數失敗(以特定的方式),那麼它不會失敗(以這種方式)。所以你可能會問'memset'失敗時會發生什麼,因爲當'calloc'無法清除內存時會發生什麼情況。兩者的答案都是一樣的 - 不允許失敗。 – 2012-02-15 09:29:22

回答

4

如果calloc()返回一個非NULL指針,則內存塊將被置零。

除非你有一個錯誤的庫。在這種情況下,你應該謹慎行事。也許可以考慮獲得一個新的工具鏈,修復bug(大多數庫都附帶源代碼),或者在malloc()之上編寫自己的calloc()版本。

我認爲calloc()的機會是堅如磐石的,除非你有一個絕對古老的,預標準的編譯器,或者一些編譯器針對非常非常小的系統,他們覺得需要切角我會假設他們會記錄在案)。

+0

謝謝,文檔需要添加這個,它寫在那裏:「_如果函數未能**分配所請求的內存塊,則返回一個NULL指針。」 - 未能**分配**未失敗**初始化**。 – 2012-02-15 08:27:28

+3

那麼,如果它成功地分配它,那麼初始化意味着已經成功。如果您無法初始化(即寫入)您似乎已分配的內存塊,則會遇到更大的問題。 – tangrs 2012-02-15 08:46:46

相關問題