C 这是memmove按相反顺序的正确方法吗?

C 这是memmove按相反顺序的正确方法吗?,c,memory-management,memmove,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,它记录了下一个可以插入的位置,在上面给出的例子中,

我想了解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

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) 
现在,如果我想删除块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)
有更好的方法吗


注意这不是为了家庭作业。

C
D
一起占据50+10=60,那么为什么在
memmove(输入+开始(B),输入+开始(B)+长度(B),20)


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

你说得对,亚历克斯,我对这一部分犯了错误,而对我正在编辑问题的另一部分,我也犯了错误。