我引用了malloc(3)中t2
定义的一部分
(http://man.he.net/?topic=malloc§ion=all)
除非ptr为NULL,否则必须通过之前的调用返回 malloc(),calloc()或realloc()。
如果我们通过integral
realloc
拨打非realloc
的{{1}},但早期的ptr
NULL
来电未提及还是malloc()
?
realloc的行为未定义?还有另一个答案吗?
答案 0 :(得分:6)
来自http://en.cppreference.com/w/c/memory/realloc(强调我的):
重新分配给定的内存区域。它必须先由
malloc()
,calloc()
或realloc()
分配,但尚未通过拨打free
或realloc
来解除。否则,结果未定义。
从C99标准(强调我的):
7.20.3.4
realloc
功能3如果
ptr
是空指针,则realloc
函数的行为类似于指定大小的malloc
函数。否则,如果ptr
与先前由calloc
,malloc
或realloc
函数返回的指针不匹配,或者如果通过调用{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也可能值得一读。