2016-11-26 7 views
0

例:配列に整数{1,2,3,4}が含まれています {2,3,4}を格納するために配列のサイズを変更したいのですが、配列[0]を実行すると2になります。配列のサイズを再割当てする方法は?

+3

配列が動的でない限り、配列はまったく収縮していません。それでも、コンテンツを回転させるために何らかの作業が必要になります。コードが必要です。あなたのことから始めましょう。あなたはどのような種類の配列(動的対固定)を持っているのか、それまでにあなたの問題を解決しようとしてきたのか分かりません。 – WhozCraig

答えて

3

realloc()で配列を縮小すると、配列の最後にはスペースを削除できますが、配列の先頭にはスペースを削除できません。

/* setup */ 
int *data = malloc(4 * sizeof(int)); // Error check omitted 
for (int i = 0; i < 4; i++) 
    data[i] = i + 1; 
/* setup complete */ 

/* Move elements before shrinking array */ 
memmove(&data[0], &data[1], 3 * sizeof(int)); // Safe move 
int *new_data = realloc(data, 3 * sizeof(int)); 
if (new_data != 0) 
    data = new_data; 

「縮小するかどうか私はわからない:したがって、あなたが望む結果を達成するために、あなたはその新しい位置に維持し、その後、配列のサイズを変更したい配列の一部をコピーする必要があるだろう'realloc()はNULLを返すことはありませんが(標準ではできないと言っているわけではありません)、コードにはチャンスはありません。多くの人がdata = realloc(data, 3 * sizeof(int));と書いてリスクを冒すと、彼らはほとんどすべての時間を離れます。 realloc()は実際にはNULLを返すことができ、old_ptr = realloc(old_ptr, new_size)のイディオムを使用するとメモリがリークすることに注意してください。

通常、 'shrinking' realloc()は元のポインタを返します(NULLを返す可能性がある場合はゼロサイズに縮小しない限り)。 「成長する」realloc()は、データが格納されている場所を変更することがよくあります。

+0

"realloc()が縮小してもNULLを返すことができるかどうかはわかりません" - それは間違いなく可能です。たとえあなたが2Mの配列を、例えば10バイトに 'realloc 'しても、10バイトの空きがないことは間違いありません。そのため、古いポインタをどこか安全に保つ必要があります。 – tofro

+1

@tofro 1. 2MBの配列を10バイトに縮小する場合、メモリマネージャは10バイトを使用できるようにする必要があります。 2.できないとしても、なぜ元のポインタを返すことで縮小が成功したと「realloc」しないのでしょうか? – jamesdlin

+0

@jamesdlin実装が主張するすべてのことが*起こることがあります。 On(2):ライブラリ関数は、実行されるべきことができないときに "all OK"を返しますか? "NULLを返す"場合は、このために予約されています( "古いブロックをそのまま残しておきます")。 – tofro

関連する問題