簡體   English   中英

malloc(sizeof(int))和malloc(sizeof(int *))有什么區別

[英]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.

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