簡體   English   中英

適用於malloc的正確論據

[英]Proper argument for malloc

我總是使用malloc函數,例如,

int size = 10000;
int *a;
a = malloc(size * sizeof(int));

我最近遇到了一段丟棄sizeof(int)部分的代碼,即

int size = 10000;
int *a;
a = malloc(size);

第二個代碼似乎工作正常。

我的問題是,哪種形式是正確的? 如果是第二種形式,我是否用第一種形式分配不必要的空間。

malloc的參數是要分配的字節數。 如果需要空間用於類型為Tn元素的數組,請調用malloc(n * sizeof(T)) malloc不知道類型,它只關心字節。

唯一的例外是當你為(byte / char )字符串分配空間時, sizeof可以省略,因為在C中每個定義的sizeof(char) == 1做類似的事情

int *a = malloc(10000);
a[9000] = 0;

現在似乎可以工作,但實際上利用了未定義的行為。

malloc分配給定數量的字節值的內存,適合任何類型。 如果要存儲類型為T N元素,則需要N * sizeof(T)字節的對齊存儲。 通常, T * p = malloc(N * sizeof(T))提供了這一點,並允許您將元素索引為[0,N p[i]中的i p[i]

從手冊頁:

malloc()函數分配大小字節並返回指向已分配內存的指針。

第一種形式是正確的。

即使您要定位的機器上的sizeof(int)是一個(在8位微控制器上有時也是如此),您仍然希望您的代碼可讀。

“第二個代碼似乎工作正常”的原因是你很幸運。

您正在使用的malloc版本可能正在返回指向大於您請求的內存區域的指針。 無論幕后發生什么,如果切換到不同的編譯器,行為可能會改變,因此您不想依賴它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM