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'で指定されたサイズを持つ新しいオブジェクトへのポインタを返します。いくつかの実装では、新しいオブジェクトは古いオブジェクトと同じアドレスを持ちますが、古いオブジェクトは技術的に解放されています。以前に割り当てられたメモリに正当にアクセスすることはできません。その場合、未定義の動作につながります。したがって、何が起こるかをテストする方法はありません。ほとんどの実装では、メモリを縮小するとデータは移動しませんが、保証はありません。 –