【问题标题】:What is difference between malloc() and realloc()? [duplicate]malloc() 和 realloc() 有什么区别? [复制]
【发布时间】:2013-10-25 13:32:38
【问题描述】:

假设我有两个代码示例用于创建一个包含 10 个元素的整数数组:

 int *pi = (int*) 0x000; //base ADDRESS of OS
    realloc(pi,10);

另一个是正常写的,即:

int *pi;
pi=(int*) malloc(10*sizeof(int));

现在,我的问题是:第一种类型的赋值是合法的,但没有使用。为什么? 它们之间有什么区别?

【问题讨论】:

  • 首先它不是c++ 特定的。
  • 有趣的是,它似乎与上述问题的完全相同,看起来像是复制的!

标签: c++ c memory-management malloc realloc


【解决方案1】:

注意:等效调用是realloc(pi, 10 * sizeof(int))

realloc 文档解释说,在您的具体情况下,调用与 malloc 相同:

如果 ptr 为 NULL,realloc() 等同于对 size 字节的 malloc() 调用。

【讨论】:

  • 第一次不能在指针上使用 realloc。首先你创建一个指针,然后你可以给它分配一个内存地址。
【解决方案2】:

realloc 可以扩展、收缩或不更改分配的内存段。根据实施情况,它可能比分配新块和复制旧内容(可能是部分内容)和删除旧内容更有效。

除此之外,空指针上的realloc 应该具有与malloc 完全相同的结果和性能。

【讨论】:

    【解决方案3】:

    0x000不是OS的基地址,是整数0,编译器会将其转换为空指针。所以第一段代码是一样的:

    int *pi = realloc(NULL,10);
    

    效果和

    一样
    int *pi = malloc(10);
    

    请注意,由于缺少sizeof(int),它与您的第二个示例不同。

    在这种情况下人们通常不使用realloc 的原因仅仅是malloc 可以完美地完成这项工作。

    【讨论】:

      【解决方案4】:

      realloc() 函数希望它的第一个参数是一个指针,该指针是通过先前发出的对 malloc() 的调用获得的。它分配一个新的内存块并释放以前分配的内存块。

      如果您将NULL 传递给realloc(),它的行为方式与malloc() 相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-28
        • 2017-09-08
        • 2015-11-21
        • 2013-06-10
        • 2016-07-19
        • 2015-12-17
        相关资源
        最近更新 更多