2014-04-14 50 views
3

我見過malloc()和realloc()使用了一堆不同的方法。在測試了各種方法後,我很想知道我是否正確使用它們?正確計算malloc()和realloc()的大小的方法?

首先我想

int size = rowSize * colSize; 
int newSize = size + rowSize; 

int *randomNum; 

randomNum = malloc(size * sizeof *randomNum); 

randomNum = realloc(randomNum, newSize * sizeof *randomNum); 

和作品!

然後我嘗試,

int size = rowSize * colSize; 
int newSize = size + rowSize; 

int *randomNum; 

randomNum = malloc(size * sizeof(int)); 

randomNum = realloc(randomNum, newSize * sizeof(int)); 

而且作品也。所以我想我不知道爲什麼我會使用「sizeof * some_name」與「sizeof(int)」?是否有理由相互使用一個?

+1

是正確的,你應該檢查'realloc的()'的返回值之前覆蓋舊的。 – glglgl

+0

謝謝glglgl,你能舉個例子嗎? – jc72

+0

@glglgl,好吧,我想我找到了一個例子,謝謝你的提示! – jc72

回答

3

它們是一樣的。之前使用您的示例的原因是稍後如果您決定更改類型,便於維護。

也就是說,不要使用realloc這樣的 - 如果失敗了,你會泄漏原來的randomNum分配。

+0

那麼第二個更好,雖然它更維護? – jc72

+1

什麼?不,第一個更好,恕我直言。其他人可能有不同的看法它們是一樣的,所以它並不重要。 –

+0

哦,對不起,謝謝Carl – jc72

0

接受後回答

@Carl Norum時的回答是不錯的,但大多與這個工作,它增加了一些分。

使用sizeof(*pointer)sizeof(type)是樣式問題。
我發現第一個維護更容易,而且更少出錯。適用於malloc()realloc()

size_t count = rowSize * colSize; 
int *randomNum = malloc(count * sizeof *randomNum); 
int *randomNum = malloc(count * sizeof(int)); 

realloc()

int *randomNum = NULL; 
... 
size_t N = foo(); 

// If N is zero, (a strange case) one might want to increase it. 
// Successfully allocating 0 bytes may return NULL or a non-NULL pointer. 

int *randomNum2 = realloc(randomNum, N * sizeof(*randomNum)); 
if (randomNum2 == NULL && N > 0) { 
    // randomNum still contains what it use to. 
    Handle_allocation_failure(); 
    ... 
    free(randomNum); 
} 
else { 
    // The happy path 
    randomNum = randomNum2; 
    ... 
    free(randomNum); 
} 
+0

@ jc72更多'realloc()'細節,請參閱http://codereview.stackexchange.com/questions/36662/critique-of-realloc-wrapper – chux