2
我有几个关于理解 realloc
行为的问题。减少realloc
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *str;
/* Initial memory allocation */
str = malloc(5 * sizeof(int));
*str = 1;
*(str + 1) = 2;
*(str + 2) = 3;
*(str + 3) = 4;
*(str + 4) = 5;
/* Reallocating memory */
int i, j;
for (i = 5; i > 0; i--) {
str = realloc(str, i * sizeof(int));
for (j = 0; j < i; j++) {
printf("%d", *(str + j));
}
printf("\n");
}
free(str);
return(0);
}
在此代码示例,我可以肯定的是较小的
realloc
将下降最多?realloc
是只释放最后的内存,并保留在str
相同的地址?或者地址可能会发生变化,即使它变得越来越小,并且当前有足够的空间吗?
realloc()总是被允许移动到新的地址空间。例如,它可能为不同大小的块使用不同的内存区域。 – Barmar
C99和C11对'realloc()'很清楚:_ realloc函数将释放'ptr'指向的旧对象,并返回一个指向size的指定大小的新对象的指针。有时在一些实现中,新对象具有与旧对象相同的地址,但是旧对象在技术上已经被释放。您无法合法访问之前分配的任何内存 - 这样做会导致未定义的行为。因此,你无法测试会发生什么。当内存缩小时,大多数实现不会移动数据 - 但根本无法保证。 –