这是memmove的正确反向顺序吗?

时间:2012-09-26 08:54:54

标签: c memory-management memmove

我试图了解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)

假设我们有一个变量X,它记录下一个可以插入的位置,在上面给出的例子中它将是90。 现在,如果我想删除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(input+start(B)-(start(B)-length(B)-X),input+X,start(B)-length(B)-X)

根据Alex的评论,我认为我没有保持正确的数据排序。数据就像,

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)

有更好的方法吗?

请注意,这不适用于家庭作业。

1 个答案:

答案 0 :(得分:0)

CD一起占据50 + 10 = 60,那么为什么memmove(input+start(B), input+start(B)+length(B), 20)中有20个?

至于另一部分,在C对象中不要以它们的最后一个字节开始(第一个字节位于最低地址,最后一个字节位于最高位置)。这部分令人困惑。