2012-09-26 4 views
0

저는 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) 

의 우리가 위의 예에서는 90 될 것이라고 다음 삽입 할 수있는 기록하는 변수 X를한다고 가정 해 봅시다. 이제 B를 삭제하고 싶다면 C와 D를 B가 차지하는 여유 공간으로 이동시키고 싶습니다. 입력은 입력 배열입니다.

memmove(input+start(B),input+start(B)+length(B),X-(start(B)+length(B)) 

가 지금은 반대를위한 시도하려는 : 그래서 입력 배열이 블록에 속하는 처음 10 개 문자를 가진 모양을, 다음 (20)는 다음과 같이 내 생각이 memmove를을 사용하여 수행 할 수 있습니다 등 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 것입니다. I는이 방식으로 수행 할 수 있다고 생각 : 알렉스 주석 사항에 따라

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) 

더 좋은 방법이 있습니까?

숙제가 아닙니다.

답변

0

CD이 함께 50 + 10 = 60을 차지하므로, 왜 memmove(input+start(B), input+start(B)+length(B), 20)에서 20을 차지합니까?

다른 부분과 마찬가지로 C 개체는 마지막 바이트 (첫 번째 바이트는 가장 낮은 주소에 있고 마지막 바이트는 가장 높은 바이트)에 시작하지 않습니다. 이 부분은 혼란 스럽습니다.

+0

당신은 맞습니다. 나는이 부분을 실수로 만들었고 다른 부분은 내가 편집하고 있습니다. – gizgok

관련 문제