[英]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
的參數是要分配的字節數。 如果需要空間用於類型為T
的n
元素的數組,請調用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.