首页 文章

realloc如何处理使用calloc分配的内存?

提问于
浏览
1

当我们尝试使用 realloc 调整 malloc 分配的内存时,我们通常会这样做:

char *ptr = (char *)malloc(size_1);
ptr = (char *)realloc(ptr, size_2);

如果 size_2 可能大于或小于 size_1 . 如果新大小较大,则旧数据不会丢失,并且新分配的字节未初始化 . 如果旧地址没有足够的内存来连续存储所有字节, ptr 包含的起始地址可能会改变 . realloc 将旧块的内容移动到新块中, ptr 将指向此新块的初始字节 .

但是,如果使用 calloc 分配内存,我无法理解 realloc 函数的行为 . 有人可以给我一个关于 realloc 如何在 calloc 分配的内存上工作的简要概述?

3 回答

  • 8

    我们知道malloc和calloc的内存块布局是不同的 .

    不,除了 calloc() 负责将其参数相乘(以确定块大小)并确保使用全零位模式初始化分配的块之外,我们完全没有区别 .

    其余的如下 . 无论使用什么函数来分配内存块, realloc() 如何处理内存块都没有区别 . realloc() 处理 calloc ed块的方式与处理 malloc() ed块的方式完全相同 .

  • 2

    malloc和calloc的内存块布局不同

    实际上没有. callocmalloc 之间的区别是 -

    calloc() initializes the allocated memory with 0 value.
    

    malloc() initializes the allocated memory with garbage values.
    

    以及参与其中的论点数量 .

    而且我认为 realloc 不会以 malloccalloc 分配的内存 .

    编辑

    关于你的问题 -

    a=calloc(5,sizeof(int));
    
    if(a==NULL)
     {
        printf("Error in allocating memory");
      }
    a=realloc(a,7);  // also check its return.
    

    这将按预期工作 .

  • 2

    我们知道malloc和calloc的内存块布局是不同的 .

    不,它是一样的 . 这种说法没有根据 .

    当我们尝试使用realloc调整malloc分配的内存时,我们通常会这样做:

    char *ptr=(char *)malloc(size_1); ptr=(char *)realloc(ptr, size_2);

    [where] size_2可能大于或小于size_1 . 如果新大小较大,则旧数据不会丢失,并且新分配的字节未初始化 . 如果旧地址处没有足够的存储器来连续存储所有字节,则ptr包含的起始地址可能会改变 .

    正确 .

    realloc将旧块的内容移动到新块中

    如有必要 . 如果块仅仅生长,则不需要该步骤 .

    和ptr将指向此新块的初始字节 .

    正确 .

    但是,如果使用calloc分配内存,我无法理解realloc函数的行为方式 .

    相同 .

    有人可以给我一个简短的概述abt realloc对calloc分配的内存有效吗?

    这是相同的 .

    你是在思考这个问题 . calloc(n, size) 可以实现,只有 malloc(n*size) 后跟 memset() . realloc() 不在乎 .

相关问题