![](/img/trans.png)
[英]Using Malloc, Difference between sizeof(int) * numRows and sizeof(int * [numRows])
[英]What is the difference between malloc(sizeof(int)) and malloc(sizeof(int*))
我想為下面的2d int ptr分配內存,但是我不是100%正確地正確地做到了,因此任何指向它的指針(哈哈)都很好。 我在for循環中釋放數組及其索引的方式正確嗎? 另外,第一個malloc
和第二個malloc
之間有什么區別: (int *)
和(int)
?
int **array = NULL;
int mem_size = 0;
int i = 0, j = 0;
// leaving out how mem_size is calculated, but it can vary
array = malloc(sizeof(int *) * mem_size);
if (array == NULL) {
// some error message
return;
}
for (i = 0; i < mem_size; i++) {
array[i] = malloc(sizeof(int) * 2);
if (!(array[i])) {
// some error message
for (j = 0; j < i; j++)
free(array[j]);
free (array);
return;
}
}
這只是我編寫的代碼的一部分。 最后,我釋放了數組:
for (i = 0; i < mem_size; i++)
free(array[i]);
free(array);
它只是一個編譯時間常數-第一種情況下指針的大小,第二種情況下int的大小。 它在系統之間可能有所不同(例如,如果是針對32位系統進行編譯,則指針將為4字節,而在64位系統上則為8字節)。
萬一任何malloc在for循環中失敗,我應該在那里釋放數組嗎
您應該釋放到目前為止分配的所有內容-每個array[0..(i-1)]
和array
本身。
malloc(sizeof(int *) * mem_size)
為mem_size
指針數組分配內存。
malloc(sizeof(int) * 2);
分配內存為2個整數。
同樣,您應該考慮分配普通的一維數組,並在要訪問它時僅計算索引。
sizeof(int)
等於4個字節
sizeof(int *)
也等於4個字節
...由於一個指針僅包含4個字節。
在兩種情況下,當您調用malloc(int)
和malloc(int *)
,內存管理器都會在堆上分配4個字節,並返回指向已分配內存的指針。
由於您要將那個地址存儲到數組中(這是一個雙指針,因此只能保存另一個指針的地址),因此以下行為是非法的:
array = malloc(sizeof(int *) * mem_size);
---非法使用
您可以通過以下方式實現所需的內容: int *ptr = NULL;
int **p_ptr = NULL;
ptr=(int *)malloc(sizeof(int *));
p_ptr = &ptr;
**p_ptr = 100
或任何其他值; 現在,您所做的任何更改都會反映在分配的4字節大小中
其中的每一個都是根據您的平台內的不同特性確定的。
int
的大小由編譯器確定,通常是為特定處理器指定的。
因此,它有效地源自CPU體系結構。
通常為4個字節,但在某些平台上可能為2個字節。
int*
(或任何其他指針)的大小由虛擬內存地址空間的大小確定。
因此它是有效地從MMU體系結構派生的。
在32位系統上為4字節,在64位系統上為8字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.