2016-08-12 6 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. はい。メモリブロックpのサイズがNであり、realloc(p, M)の場合は、reallocとすると、結果はpの最初のmin(N, M)バイトになります。

  2. 新しいサイズが古いサイズよりも小さい場合でも、アドレスは変更される可能性があります。 reallocは、このケースについては保証しません(失敗する可能性もあります)。

+1

また、 'realloc()'は、縮小要求の場合でも、 'NULL'を返すことができます。 –