在C中实现Realloc

时间:2012-06-02 17:48:07

标签: c malloc free realloc

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中没有任何方法)。

我的重新分配功能在我的系统上正常运行 我们如何获得malloc()分配的内存大小。

如果以前分配的内存大小大于新的内存,我们也可以进行内部重新分配吗?

3 个答案:

答案 0 :(得分:11)

没有可移植的方法来获取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);
}

答案 1 :(得分:3)

malloc不会将内存初始化为零。 (calloc与之相同。)如果你看到的东西设置为零,那就是偶然的。

我相信realloc的库版本使用堆中不可直接使用的长度信息。 (它可能会高估原始分配,这意味着在使用realloc扩展分配时可能会复制一些额外的内存。这通常没有效果。)

缩小分配时,

realloc可能无法复制。

另外,我应该注意,在相同的情况下,即使realloc增加了大小,也不必进行复制,例如,如果堆中的下一个块是空闲的。

答案 2 :(得分:1)

  

malloc分配的内存被初始化为零,所以我正在检查那个条件。

这是不正确的。从草案:

  

说明

     

2 malloc函数为其对象分配空间   size由size指定,其值是不确定的。

您的getsize需要修复。

  

我的重新分配功能正常。

您甚至没有修复对齐 - 某些类型可能会失败。阅读this SO问题。

  

如果以前分配的内存大小大于新的内存,我们也可以进行内部重新分配吗?

就地重新分配意味着什么?这不应该是一个简单的无操作吗?