realloc()函数是如何工作的?

5
假设我已经使用 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.

现在关于IT的问题如下: -
  1. Is it necessary that newline will point to same address as oldline, which holds the previous initial address?
  2. Is it so that in this case, oldline will be freed(implicitly) and newline will take the charge of memory addressing?
  3. After the above code and after the work has been done, what should I do to free memory

    free(newline);
    

    or

    free(oldline);
    

    or both?


4
在类Unix系统中,打开终端窗口并键入“man realloc”,即可找到答案。在其他操作系统中,您需要找到文档的位置。 - user3386109
1
或者在互联网上查看:http://en.cppreference.com/w/c/memory/realloc - Excelcius
任何C语言学生必读的内容:包括技术勘误TC1、TC2和TC3的C99 - Deduplicator
@Deduplicator 谢谢 - OldSchool
@Deduplicator 这些是C99的吗? - OldSchool
3个回答

9
这取决于realloc是否成功。如果realloc成功,则:
  1. 不是!例如,如果在oldline之后没有足够的连续内存,则newline将与oldline不同。

  2. 是的。

  3. free(newline);,因为如果需要,oldline已被释放。在重新分配后,oldline应视为无效指针。

如果它不成功,则像什么都没有发生一样使用oldline,特别是您应该释放它。

如果realloc返回成功,您就不需要释放oldline。但是,如果realloc返回NULL,则必须释放oldline。 - rici
如果realloc返回NULL并且size不为0且oldline不为0,则必须释放oldline。 - Deduplicator
@Deduplicator:标准保证free(NULL)是一个无操作。此外,如果你请求0字节并且realloc(或malloc)返回非NULL值,则必须释放它。因此,唯一有效的测试是“如果oldline不为0”,但你不必测试它,因为如上所述,如果oldline为0,则free(oldline)是无害的。 - rici
问题是“必须免费”,而不是“可以免费”。我没有看到你说的任何内容与我的评论相矛盾。 - Deduplicator

1

1)实际上,newline除了存储结果外根本没有被使用,你为什么会问这个问题?

2)是的。

3)只有第一个。


对于1)newline可能指向与oldline不同的位置。 - OldSchool

1

C 标准中的 realloc(old, size):

  • size == 0
    • realloc 可能释放 old 并返回 0
    • 或者 realloc 的行为与 size != 0 时相同,但不能返回 0
  • size != 0
    • realloc 可能返回 0。old 不会受到影响
    • 如果 old 所指向的块 >= size,则 realloc 可能返回 old
    • 或者 realloc 分配一个块 >= size,将 old 到 size 之间的所有字节复制到此新块中,释放 old 并返回此新块

你需要负责在算法中持续存在的块/被分配的块。

解决方法:

1 不一定。尽管有可能。

2 如果 size == 0 或返回值 != 0,则是。

3a 如果返回了 0 且 size != 0,则释放 oldline。

3b 如果返回值 != 0,则释放 newline。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接