Мне интересно, гарантирует ли стандарт C или С++, что указатель не изменяется при вызове realloc с меньшим (отличным от нуля) размером:
size_t n=1000;
T*ptr=(T*)malloc(n*sizeof(T));
//<--do something useful (that won't touch/reallocate ptr of course)
size_t n2=100;//or any value in [1,n-1]
T*ptr2=(T*)realloc(ptr,n2*sizeof(T));
//<-- are we guaranteed that ptr2==ptr ?
В принципе, может ли ОС самостоятельно решить, что, поскольку мы освободили большой блок памяти, он хочет использовать все reallocs для дефрагментации памяти и как-то переместить ptr2?