0

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)

これを行うためのより良い方法はありますか?

これは宿題ではないことに注意してください。

4

1 に答える 1

0

Cを合わせて 50+10=60をD占めるのに、なぜ 20 がmemmove(input+start(B), input+start(B)+length(B), 20)?

他の部分については、C オブジェクトは最後のバイトから始まりません (最初のバイトは最下位アドレスにあり、最後のバイトは最上位アドレスにあります)。この部分は紛らわしいです。

于 2012-09-26T09:03:11.473 に答える