memmove の仕組みを理解しようとしています。この方法でメモリにデータがある例を取り上げています。
Start at 0
First Memory Block(A) of size 10
Hence A->(0,10) where 0 being where it starts and 10 it's length.
Thus B-> (10,20)
C-> (30,50)
D-> (80,10)
上記の例では 90 である next を挿入できる場所を記録する変数 X があるとします。ここで B を削除したい場合は、C と D を B が占める空き領域に移動したいと思います。入力は入力配列です。したがって、入力配列は、最初の 10 文字がブロック A に属し、次の 20 文字がブロック B に属しているように見えます。これは、次のように memmove を使用して実行できると思います。
memmove(input+start(B),input+start(B)+length(B),X-(start(B)+length(B))
今、私は逆の順序を試してみたい.
So we start from behind
Start at 100
First memory block(A) of size 10
A-> (100,10) 100 is where it starts and 10 it's length
B-> (90,20)
C-> (70,50)
D-> (20,10)
最初の例と同様に、次に挿入できる場所を記録する変数 X があるとします。この例では、逆順で 10 になります。
ブロック B を削除する場合は、C と D を B のスペースでオーバーラップさせます。これは、逆順の memmove になります。これは次の方法で実行できると思います。
memmove(input+start(B)-(start(B)-length(B)-X),input+X,start(B)-length(B)-X)
アレックスのコメントによると、データの正しい順序を守っていないと思います。データは次のようになります。
A->(90,10)
B->(70,20)
C->(40,30)
D->(20,20)
and X which would be D's starting address i.e at 20
Now if we want to delete B,memmove would look something like this.
memmove(input+X+length(B), input+X,start(B)-X)
これを行うためのより良い方法はありますか?
これは宿題ではないことに注意してください。