2013-09-22 68 views
-4

作爲慣例,我試圖重寫realloc函數試圖改寫realloc函數在C

void updateSize(void* p,int length) 
{ 
    free(p); 
    malloc(sizeof(p) * length); 
} 

int main(int argc,char* argv[]) 
{ 
    int *y =malloc(sizeof(int)*3); 
    y = updateSize(y, 5); 
} 

但是當我嘗試編譯它,我得到以下錯誤:

void value not ignored as it ought to be. 

什麼是這個錯誤的原因,我該如何解決它?

+2

錯誤信息的哪一部分不清楚? –

+1

'updateSize'不返回任何東西(** void **),爲什麼要將它分配給'y'?錯誤消息非常豐富。 – Maroun

+0

@KerrekSB在這一行:int * y = malloc(sizeof(int)* 3); – TheCrackNuts

回答

1

OP沒有從函數返回值,也沒有根據需要複製數據。

// Function return value of `void` needs to be `void *`. 
// `length` should be of type size_t 
// The former length of `p` needs to be passed. 
// Potential NULL pointers need testing. 
void updateSize(void* p,int length) { 
    // Missing data copy. 
    // Allocate new memory and copy before freeing old 
    free(p); 
    // Returned value from malloc needs saving. 
    // No reason for 'sizeof()' 
    malloc(sizeof(p) * length); 
} 

// Recommend 
void *updateSize2(void* p, size_t OldLength, size_t NewLength) { 
    void *p2 = malloc(NewLength); 
    if (p && p2) { 
    memcpy(p2, p, OldLength < NewLength ? OldLength : NewLength); 
    } 
    if (p2 || (NewLength == 0)) { 
    free(p); // Note A 
    } 
    return p2; 
} 

注答:有一個有趣的問題NewLength == 0時。某些malloc(0)實現返回NULL,其他返回指向「無數據」的指針。在前者中,NULL指針不總是總是意味着失敗malloc()。現在@sharth正確地指出free(p)只能在內存分配失敗時調用,這裏使用的if()NewLength爲條件。

+0

你應該只在'p2!= NULL'時釋放(p)'。 –

+0

@sharth你的評論只有釋放'p2!= NULL'是一個好主意,並符合'realloc()'功能;謝謝。答覆修正。 – chux