realloc如何知道要复制多少?

realloc如何知道要复制多少?,c,realloc,C,Realloc,realloc如何知道原始数据的大小 void *realloc(void *ptr, size_t size); 因此,如果实现是这样的: temp = malloc(size); memcpy(.. // How much to copy? free(ptr); return temp; 我意识到这不是最初的实现,realloc并不总是免费的,但是当它这样做的时候,它复制了多少 编辑: 谢谢你的回答。但是我如何在代码中用malloc/free/实现realloc呢?它知道,因为

realloc如何知道原始数据的大小

 void *realloc(void *ptr, size_t size);
因此,如果实现是这样的:

 temp = malloc(size);
 memcpy(.. // How much to copy?
 free(ptr);
 return temp;
我意识到这不是最初的实现,realloc并不总是免费的,但是当它这样做的时候,它复制了多少

编辑:
谢谢你的回答。但是我如何在代码中用malloc/free/实现realloc呢?

它知道,因为
malloc
在您调用它时记录了该信息。毕竟,系统无论如何都必须跟踪分配的块的大小,这样它就不会两次分配特定的内存区域


如果你的意思是,“它怎么知道到目前为止我写了多少数组”,它不需要知道。它还可以复制任何未初始化的垃圾。

realloc(以及malloc和free)可以完全访问构成堆的整个数据结构。在该数据结构中,是关于块大小的信息,realloc需要知道,因此也需要空闲。

当你
malloc
一些内存时,你得到的块通常是一个固定的偏移量,进入一个更大的数据结构,这个数据结构也保存额外的信息,特别是块的大小。您可以通过注意
malloc
返回的每个地址在以十六进制打印时以
8
结尾(例如,用
%p
替换为
printf
)来验证这一点在某些系统上是否正确。当然,
realloc
可以反转此偏移量并返回内存管理结构,从而获得大小;从那以后,能够知道要复制多少(必要时)是微不足道的…

,但是我如何才能在malloc/free/代码中实现realloc呢?

如果您已经在使用malloc&free,为什么不直接使用realloc呢? 除此之外,您可以查看MSVC/gcc等附带的CRT源代码(或者下载它,在gcc的情况下),并了解它们是如何实现的。 如果您运行的是自定义分配器,那么情况就更为复杂了,例如:我使用一个二进制bin和一个slab类型的系统,在这种情况下realloc很简单:

void* Reallocate(Manager* pManager, void* pBlock, size_t nSize, const char* szFile, const DWORD dwLine)
{
    #if ( MMANAGER_NULL_TO_DEFAULT )
        if(pManager == NULL)
            pManager = MMANAGER_DEFUALT_MANAGER;
    #endif

    if(pBlock == NULL)
        return Allocate(pManager,nSize,szFile,dwLine);
    else if(nSize == 0)
    {
        Free(pManager,pBlock,szFile,dwLine);
        return NULL;
    }

    BlockHeader* pHeader = GetHeader(pBlock);
    size_t nPrevSize = pHeader->pPoolBlock->nSize;
    if(nPrevSize < nSize)
    {
        void* pNewBlock = Allocate(pManager,nSize,szFile,dwLine);
        memcpy(pNewBlock,pBlock,nPrevSize);
        PoolBlock* pPoolBlock = pHeader->pPoolBlock;
        if(pPoolBlock == NULL)
            free(pHeader);
        else
            FreeBlock(pPoolBlock,pHeader);

        return pNewBlock;
    }

    return pBlock;
}
void*重新分配(Manager*pManager、void*pBlock、size\u t nSize、const char*szFile、const DWORD dwLine)
{
#如果(MMANAGER\u NULL\u至\u默认值)
如果(pManager==NULL)
pManager=MMANAGER\u default\u MANAGER;
#恩迪夫
if(pBlock==NULL)
返回分配(pManager、nSize、szFile、dwLine);
否则如果(nSize==0)
{
空闲(pManager、pBlock、szFile、dwLine);
返回NULL;
}
BlockHeader*pHeader=GetHeader(pBlock);
大小\u t nPrevSize=pHeader->pPoolBlock->nSize;
如果(nPrevSizepPoolBlock;
if(pPoolBlock==NULL)
免费(免费);
其他的
自由闭塞(pPoolBlock、pHeader);
返回pNewBlock;
}
返回pBlock;
}

您为什么不在正在使用的C标准库中查找malloc/calloc/realloc/free是如何实现的呢


或者,如果您无法访问源代码,请查看它是如何在一个开源C标准库中实现的

realloc的实现必须遵循malloc和free的实现。在没有malloc和free所拥有的专门知识的情况下实现它是不可行的。如果您确实让它与一个malloc实现一起工作,那么它可能不会与其他实现一起工作。这取决于实现。您可以放心地假设您无法以任何便携方式访问它。