[英]C tutorial question relating to calloc vs malloc
我正在學習本教程 ( http://theocacao.com/document.page/234 )。 我對這一段感到困惑,主要是與calloc相關的行:
我們還可以使用malloc函數的變體,稱為calloc。 calloc函數有兩個參數,一個值計數和一個基值大小。 它還會在返回指針之前清除內存,這有助於避免在某些情況下出現不可預測的行為和崩潰:
最后一行讓我感到困惑。 清除記憶是什么意思?
函數calloc將確保返回的內存中的所有字節都設置為0. malloc沒有這樣的保證。 它返回的數據可以並且將包含看似隨機的數據。
這種區別對於數據成員的初始化非常有用。 如果0是結構中所有值的良好默認值,則calloc可以簡化結構創建。
Foo* pFoo = calloc(1, sizeof(Foo));
與
Foo* pFoo = malloc(sizeof(Foo));
pFoo->Value1 = 0;
pFoo->Value2 = 0;
為清楚起見,省略了空檢查。
准確地說:
這在某些情況下有助於避免不可預測的行為和崩潰
應該讀:
這在某些情況下隱藏不可預測的行為和崩潰非常有用
在這種情況下,“清除存儲器”意味着用物理全零位模式填充它。 注意,從形式上看,這種原始內存初始化只能保證與整數類型一起工作。 即,整數類型的對象保證接收零的初始值。 是否有意義地初始化任何其他類型是實現定義的。 (它需要超出C標准限制的額外標准才能提供額外的保證.POSIX,IEEE 754等)
是否使用calloc
來“防止崩潰”如引言中所描述的實際上是有道理的是一個不同的問題。 我會說它確實可以提高懶惰程序員編寫的代碼的穩定性,因為它會將各種垃圾值觸發的所有可能的意外行為折疊成由全零值觸發的一個特定的意外行為。
malloc()
函數分配內存塊但不初始化已分配的內存。如果我們嘗試訪問內存塊的內容,那么我們將得到垃圾值。
而calloc()
函數將分配的內存分配並初始化為零。 如果我們嘗試訪問內存塊的內容,那么我們將得到0。
不 :如何使用malloc()
函數作為calloc()
?
通過使用string.h
庫的memset()
函數, malloc()
函數可以用作calloc()
函數,如下所示。
int *ptr;
ptr=malloc(size);
memset(ptr,0,size);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.