realloc()问题:旧块的释放,旧大小的旧大小,以及传递静态数组基址

时间:2013-05-21 18:16:44

标签: c dynamic-memory-allocation realloc memory-management

在阅读realloc()时,我偶然发现了一些我需要澄清而不是忽视的疑问。你的答案非常受欢迎。为了清楚起见,我把它们放在了编号列表中。请不要介意这个问题的长度。

1)使用realloc()时,如果内存块及其内容被移动到新位置,则原始地址是否会取消分配,就好像我们一样在它上面调用了free()吗?我已经从cplusplusreference中读到了关于realloc的以下内容,但是虽然它们接近于暗示原始内存块确实在这种情况下被解除分配,但我需要你的确认。

->C90 (C++98)C99/C11 (C++11) Otherwise, if size is zero, the memory previously allocated at ptr is deallocated as if a call to free was made, and a null pointer is returned.

->If the function fails to allocate the requested block of memory, a null pointer is returned, and the memory block pointed to by argument ptr is not deallocated (it is still valid, and with its contents unchanged).

2)以下是提出问题的另一条话:"If the new size is larger, the value of the newly allocated portion is indeterminate."。嗯,这就是我想知道的事情

i)是否允许写入新分配的部分?

ii)新分配的部分是否使用垃圾值填充?

3)最后,如果将数组对象传递给realloc(,该怎么办?)我问,因为虽然类型仍然是char* ,在源网站中提到,参数应该是"Pointer to a memory block previously allocated with malloc, calloc or realloc.这里也是 UB ,因为我在free()的描述中读到{{1} }} free()

1 个答案:

答案 0 :(得分:9)

  

1)在使用realloc()时,如果内存块及其内容被移动到新位置,那么原始地址是否会被解除分配,就像我们在其上调用free()一样?

是的,如果realloc()返回指向其他位置的指针,则旧位置为free d。

如果free无法获得足够大的内存块并返回realloc,则不是NULL

  

2)这是提出问题的另一条线:"如果新尺寸较大,则新分配的部分的值是不确定的。"。好,这就是我想要的知道

     

i)是否允许写入新分配的部分?

是的,当然。这就是重新分配更大内存块的全部意义。

  

ii)新分配的部分是否使用垃圾值填充?

充满垃圾,根本没有填充 - 内存块的内容是不确定的,除了从旧块复制的部分。您不应该关心有什么位,在阅读之前将自己的东西放在那里。

  

3)最后,如果将数组对象传递给realloc()怎么办?我问,因为虽然type仍然是char*,但是在源站点中提到,参数应该是"指向先前用malloc分配的内存块的指针,{{1} }或calloc。这也是UB,因为我在realloc的描述中读到free()

是的,如果您将参数(free()除外)传递给NULL,而该参数不是之前拨打reallocmalloccalloc的。 (从那以后没有realloc),行为未定义。

可以合法传递给free的指针与传递给realloc的指针完全相同。