2016-08-12 34 views
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); 
} 
  1. 在此代码示例,我可以肯定的是较小的realloc将下降最多?

  2. realloc是只释放最后的内存,并保留在str相同的地址?或者地址可能会发生变化,即使它变得越来越小,并且当前有足够的空间吗?

+1

realloc()总是被允许移动到新的地址空间。例如,它可能为不同大小的块使用不同的内存区域。 – Barmar

+0

C99和C11对'realloc()'很清楚:_ realloc函数将释放'ptr'指向的旧对象,并返回一个指向size的指定大小的新对象的指针。有时在一些实现中,新对象具有与旧对象相同的地址,但是旧对象在技术上已经被释放。您无法合法访问之前分配的任何内存 - 这样做会导致未定义的行为。因此,你无法测试会发生什么。当内存缩小时,大多数实现不会移动数据 - 但根本无法保证。 –

回答

4
  1. 是。如果您有一个大小为N的内存块p,并且您做了realloc(p, M),则(假设realloc成功),结果将包含来自p的第一个min(N, M)字节。

  2. 即使新尺寸小于旧尺寸,地址也会更改。 realloc根本就不能保证这种情况(甚至可能会失败)。

+1

即使对于收缩请求,realloc()也可以返回NULL。 –