理解一个部分是malloc中realloc的定义(3)

时间:2016-06-29 18:14:45

标签: c malloc

我引用了malloc(3)中t2定义的一部分 (http://man.he.net/?topic=malloc&section=all

  

除非ptr为NULL,否则必须通过之前的调用返回   malloc(),calloc()或realloc()。

如果我们通过integral realloc拨打非realloc的{​​{1}},但早期的ptr NULL来电未提及还是malloc()

realloc的行为未定义?还有另一个答案吗?

3 个答案:

答案 0 :(得分:6)

来自http://en.cppreference.com/w/c/memory/realloc(强调我的):

  

重新分配给定的内存区域。它必须先由malloc()calloc()realloc()分配,但尚未通过拨打freerealloc来解除。否则,结果未定义

从C99标准(强调我的):

  

7.20.3.4 realloc功能

     

3如果ptr是空指针,则realloc函数的行为类似于指定大小的malloc函数。否则,如果ptr与先前由callocmallocrealloc函数返回的指针不匹配,或者如果通过调用{free已释放空间{1}}或realloc功能,行为未定义

答案 1 :(得分:0)

如果您将指针realloc()free()移交给我malloc()从未提供给您的指针,那么幕后会发生什么事情是您的C库会做出一些假设,例如可能存在能够在指针之前找到并解释一些内存作为块头,告诉它块的长度等等。因为那不存在,任何都可能发生。

内存管理也假设这个内存现在是我的 - 如果你没有立即崩溃,你可能会从下一个malloc()那里得到那个迷路指针并且必须处理它...

Glibc通常会对你进行调查,因为它试图检测这种情况(但是barfing也是未定义行为的一部分)。

答案 2 :(得分:0)

  

如果我们用不是NUL的ptr调用realloc,而且之前调用malloc(),calloc()或realloc()没有返回怎么办?

显然是错的。

一个常见的初学者错误是试图在对象上使用realloc()指向前一次调用{{1}函数的第一个元素未指回的指针一家人。一个典型的例子是将一个自动数组传递给一个应该修改其内容的函数,也可以通过将对象的指针传递给malloc()来调整它的大小。代码会编译,但程序可能会中止。 realloc调试器会发出如下消息:

lldb

`malloc: error for object 0x7fff6fbb16d6: pointer being realloc'd was not allocated` 调试器会发出类似但稍微复杂的消息,例如:

gdb

这仍然是一个更好的案例。通过本书,这些调用所推断的行为是不确定的。您可以查看任何操作系统的`malloc.c:2869: mremap_chunk: Assertion `((size + offset) & (GLRO (dl_pagesize) - 1)) == 0' failed. ` `Aborted (core dumped)` 。另请参阅this SO post。这reference link也可能值得一读。