缩小指针所占用的内存时的realloc行为

Abh*_*nav 2 c realloc

困惑1:
man realloc说,如果它做新的分配对象调整到新的大小的物体将被移动.然而,在缩小尺寸时,有许多地方表示可以将内存中的数据移动到新的地方(SO).这让我感到困惑.我们如何发现缩小规模将在新的分配中失败,因为在手册页和gnu页面中没有明确提到减小大小的情况.

困惑2:
当我们做以下时:

void * ptr1 = malloc(SOMEBIGSIZE);
void * ptr2 = realloc(ptr1, SOMESMALLSIZE);
Run Code Online (Sandbox Code Playgroud)

评估ptr1==ptr2结果是真的.这意味着ptr2指向相同的ptr1.那么,哪个2.1或2.2是真的?
(2.1) ptr1没有缩小尺寸,如果SOMEBIGSIZE >>> SOMESMALLSIZE并且我们在内存方面没有任何优势,那可能会很糟糕.
(2.2)如果ptr1收缩,那么地址范围ptr1 + SOMESMALLSIZE到ptr1 + SOMEHUGESIZE的内存会发生什么变化?它被释放或标记为免费吗?

Alo*_*ave 6

C标准从用户程序的角度讲述了realloc的行为.它没有定义实现.

以下是实施标准强加的相关要求(在您的Q中提出).

C99标准7.20.3.4-1:重新分配功能:

realloc函数释放ptr指向的旧对象,并返回指向具有size指定大小的新对象的指针.新对象的内容应与解除分配之前的旧对象的内容相同,直到新旧大小中的较小者为止.新对象中超出旧对象大小的任何字节都具有不确定的值.

C99标准7.20.3.4-4:

realloc函数返回指向新对象的指针(可能与指向旧对象的指针具有相同的值),如果无法分配新对象,则返回空指针.