2012-06-02 40 views
2
int getmin(int a, int b) 
{ 
    return a<b?a:b; 
} 


void *reallocation(void *ptr, size_t size) //size_t in bytes 
{ 

    void *newptr; 


    int msize; 
    msize = getsize(ptr); 

    msize = getmin(msize, size); 

     printf("msize = %d", msize); 

    newptr = malloc(size); 
    newptr = memcpy(newptr, ptr, msize); 
    free(ptr); 


    return newptr; 

} 

我已經實現了我自己的realloc,並且爲了使用malloc獲得分配內存的大小(但是我知道在c中沒有任何方法)。在C中實現Realloc

我的重新分配函數在我的系統上正常工作 我們如何獲得由malloc()分配的內存大小。

如果先前分配的內存大小大於新的要求,我們還可以在就地重新分配嗎?

+0

您的總體目標是什麼?你只是重寫'realloc'或者你想創建一整套內存分配例程嗎? –

回答

3

malloc不會將存儲器初始化爲零。 (calloc與此相當。)如果您將事情設置爲零,則意外。

我相信realloc的圖書館版本在堆中使用不是直接可用的長度信息。 (它可能高估原始分配,這意味着使用realloc時擴大分配可能複製一點點額外的內存,這通常沒有什麼作用。)

realloc萎縮的分配時,可能不會做一個副本。

另外,我應該注意,在同樣的情況下,即使當realloc增加了大小,例如,如果堆中的下一個塊是空閒的,您也不必複製副本。

+0

它可能不會被意外設置爲零,但出於安全原因,大多數操作系統都會使用零填充新分配的頁面。 – JustSid

+1

@JustSid是的,但你不知道這是一個新分配的頁面。它可能以前被分配並釋放內存。 –

+0

在g ++中試試這個有趣的代碼:'int * ip = new int; * ip = 42; delete ip; int * ip2 = new int; std :: out << * ip2 << endl;'。它會愉快地打印「42」。 –

1

由malloc分配的內存得到初始化爲零,所以我正在檢查這種情況。

這是不正確的。從草案:

說明

malloc函數爲一個對象,其 大小由大小指定,並且其值是不確定的分配空間。

您的getsize需要修復。

我的重新分配函數工作正常。

您甚至沒有修復對齊 - 它可能會失敗的某些類型。閱讀this SO問題。

如果先前分配的內存大小大於新的要求,我們還可以在就地重新分配嗎?

原地重新分配是什麼意思?這不應該是一個簡單的不操作?

+0

我們如何解決對齊問題? – Luv

+0

@Luv:請參閱編輯我的答案與相關SO問題。 – dirkgently

10

沒有可移植的方式來獲取由malloc()分配的內存大小。

但是,人們總是可以做類似的事情來模擬你想要的東西。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void myfree(void * p) { 
    size_t * in = p; 
    if (in) { 
     --in; free(in); 
    } 
} 

void * mymalloc(size_t n) { 
    size_t * result = malloc(n + sizeof(size_t)); 
    if (result) { *result = n; ++result; memset(result,0,n); } 
    return result; 
} 

size_t getsize(void * p) { 
    size_t * in = p; 
    if (in) { --in; return *in; } 
    return -1; 
} 

#define malloc(_x) mymalloc((_x)) 
#define free(_x) myfree((_x)) 

void *reallocation(void *ptr,size_t size) { 
    void *newptr; 
    int msize; 
    msize = getsize(ptr); 
    printf("msize=%d\n", msize); 
    if (size <= msize) 
     return ptr; 
    newptr = malloc(size); 
    memcpy(newptr, ptr, msize); 
    free(ptr); 
    return newptr; 
} 
int main() { 
    char * aa = malloc(50); 
    char * bb ; 
    printf("aa size is %d\n",getsize(aa)); 
    strcpy(aa,"my cookie"); 
    bb = reallocation(aa,100); 
    printf("bb size is %d\n",getsize(bb)); 
    printf("<%s>\n",bb); 
    free(bb); 
} 
+0

如果返回類型被聲明爲無符號,則getsize不應返回-1 –