2011-04-06 11 views
1

私は構造体の配列を持っていて、いくつかの条件に一致するエントリを持つ構造体を持つエントリを削除したいとします。Cで動的に割り当てられた配列メンバーを削除する

この配列はmallocで動的に割り当てられますが、要素数は別の変数に保持されます。

エントリを削除するにはどうすればよいですか?

私は

for (i = pos; i < arr_len; i++) { 
    arr[i] = arr[i+1]; 
} 
arr_len--; 

と思っています。しかし、これは私が実際にあまり必要としながら、配列にメモリの同じ量を残し、孤児(一種の)最後のエントリ。

このような状況では、受け入れられた練習を再発行していますか?この場合、memcpyをreallocしますか? (割り当てられたメモリを1ブロック短縮する)。

答えて

4

realloc okです...しかし、読み続ける:)

reallocは、メモリの一部を移動しません。それはブロック全体を動かすかもしれない。したがって、割り当てられたサイズを変更する前にデータをコピーする必要があります。

データを移動するには、memmovememcpyではありません)が適しています。これは同じオブジェクトに属するメモリ領域で機能します。しかし、配列の制限を超えないように注意してください。あなたのコードのように。

for (i = pos; i < arr_len; i++) { 
    arr[i] = arr[i+1]; 
} 

arr[i] = arr[i + 1];は許容サイズを超えてアクセスしようとします。あなたはreallocを呼び出すときに多少のオーバーヘッドがあり

for (i = pos + 1; i < arr_len; i++) { 
    arr[i - 1] = arr[i]; 
} 

を必要としています。あなたの構造体が大きくなく、そして/またはそれらが短期間しか存在しない場合は、要素数と割り当て数の両方を保持し、拡大するために再割り当てすることを考慮してください((element_count + 1) > (allocated_count)の場合)。構造体が大きい場合


すること、また、異なるデータ構造(おそらくリンクリスト)を考えます。

+0

最後の要素アクセスのキャッチに感謝します。私はこの特定のケースを紙に書いていますが、配列が0からインデックスされていることを忘れてしまっても、それを見逃してしまいました! – Karolis

0

ここではreallocを使用するのが適切でしょう。それはmemcpyをしません - それは、reallocサイズが大きく、展開する余地がない場合にのみ必要です。

1

割り当てられたメモリを縮小するためにreallocを呼び出すと、必ずしも悪い考えではありません。

ただし、使用しているデータ構造を再検討する必要があります。リンクされたリストのように見えると、メモリの管理がずっと簡単になり、要素のシフトを必要としないため、削除操作がはるかに高速になります。

関連する問題