realloc()如何工作?

时间:2014-03-29 18:29:12

标签: c realloc

假设我使用malloc()分配了内存,如果我在我的代码中执行:

char *newline = realloc ( oldline , newsize );
// Assuming oldline is the pointer to which the starting address
// of the memory which malloc() has returned, is assigned and,
// say, newsize is integer having 100 value.

现在我的问题是: -

  1. newline是否有必要指向与oldline相同的地址,其中包含先前的初始地址?
  2. 是不是在这种情况下,oldline将被释放(隐式),newline将负责内存寻址?
  3. 完成上述代码后,工作完成后,我该如何释放内存

    free(newline);
    

    free(oldline);
    

    或两者兼而有之?

3 个答案:

答案 0 :(得分:8)

取决于realloc是否成功。如果realloc成功,那么:

  1. 不!例如,如果在oldline之后没有足够的连续内存,则newline将与oldline不同。

  2. free(newline);,因为必要时已释放oldline。在将realloc oldline视为无效指针后。

  3. 如果不成功。然后,你使用oldline就像什么也没发生一样,特别是你应该释放它。

答案 1 :(得分:1)

1)否..实际上newline根本没有使用(除了存储结果),为什么要问这个?

2)是的

3)只有第一个。

答案 2 :(得分:1)

realloc(old, size)的C标准:

  • size == 0
    • realloc可能会自由旧并返回0
    • 或者realloc的行为与大小相同!= 0但不能返回0
  • 尺寸!= 0
    • realloc可能会返回0.感兴趣的是旧的
    • 如果old指向的块是> = size,则realloc可能会返回旧的
    • 或者realloc分配一个块> = size,将所有字节从old复制到size,释放旧并返回这个新块

您负责通过此算法保留的任何块/已分配。 解决这些问题:

1号虽然可以。

2是,如果size == 0或者返回!= 0

3a free oldline,如果返回0且大小!= 0

3b免费换行,如果退回!= 0