我试图了解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)
有更好的方法吗?
请注意,这不适用于家庭作业。
答案 0 :(得分:0)
C
和D
一起占据50 + 10 = 60,那么为什么memmove(input+start(B), input+start(B)+length(B), 20)
中有20个?
至于另一部分,在C对象中不要以它们的最后一个字节开始(第一个字节位于最低地址,最后一个字节位于最高位置)。这部分令人困惑。