2011-10-11 3 views
0

큰 임시 버퍼를 사용하지 않고 * src 및 * dst에 대해 음수 또는 양수 증분을 사용하여 가능한 겹쳐서 메모리를 이동하려고합니다. (memmove() 함수를 효율적으로 대체 할 수 있습니까?

smart_memmove(char *dst, const char *src, size_t num, int dst_inc, int src_inc); 

DST와 겹칠 수 SRC 및 dst_inc 및 src_inc는 양 또는 음의 정수가 될 수 있습니다

나는의 라인을 따라 효율적으로 memmove() 기능에 대한 대체 뭔가을 마련하기 위해 노력하고 있어요 음의 증분은 시작 포인터가 위로 가면서 메모리에서 뒤로 이동 함을 나타냅니다. 나는 그것이 실행 속도의 감소를 의미한다고하더라도 큰 임시 버퍼를 사용하는 것을 피하고 싶다.

이러한 예 1에서 메모리 위치를 거꾸로 카운트 (17), 10 바이트마다 다른 바이트에서 증가 된 메모리 위치 0부터 복사 될 것이다 :

smart_memmove(17, 0, 10, -1, 2); 

다른 예는 역방향 가령하는 것 메모리 위치의 바이트의 10 시리즈 6, 9, 12, 15, 18, 21, 24, 27, 30, 33 다음 매개 변수 smart_memmove 호출 기준 :

참고 또한 memcpy가 선호 할
smart_memmove(6, 33, 10, 3, -3); /* or... smart_memmove(33, 6, 10, -3, 3); */ 
+0

'src_inc'와'dst_inc'의 의미는 무엇입니까? –

+0

dst + = dst_inc; – user613994

+0

그건 잘못된 C 코드입니다. 그리고 나는 아직도'dst_inc'가 무엇을 의미하는지 모른다. –

답변

0

() 함수 .

void * memcpy (void * destination, const void * source, size_t num); 

destination 콘텐츠를 복사 할 대상 배열 포인터는 * 형 공극의 포인터 타입 캐스트.

source 복사 할 데이터 소스에 대한 포인터. const void * 유형의 포인터로 타입 캐스트됩니다.

num 복사 할 바이트 수.

size_t은 부호없는 정수 유형입니다.

소스가 가리키는 위치의 num 바이트 값을 대상이 가리키는 메모리 블록으로 직접 복사합니다.

원본 포인터와 대상 포인터가 모두 가리키는 개체의 기본 형식은이 함수와 관련이 없습니다. 결과는 데이터의 2 진 사본입니다.

이 함수는 소스에서 종료 문자가 없는지 확인합니다. 항상 num 바이트를 정확하게 복사합니다.

오버플로를 방지하려면 대상 및 소스 매개 변수가 가리키는 배열의 크기는 적어도 num 바이트 여야하며 겹치지 않아야합니다 (메모리 블록이 겹치는 경우 memmove가 더 안전한 방법 임).

샘플 프로그램

/* memcpy example */ 
#include <stdio.h> 
#include <string.h> 

struct { 
    char name[40]; 
    int age; 
} person, person_copy; 

int main() 
{ 
    char myname[] = "user613994"; 

    /* using memcpy to copy string: */ 
    memcpy (person.name, myname, strlen(myname)+1); 
    person.age = 46; 

    /* using memcpy to copy structure: */ 
    memcpy (&person_copy, &person, sizeof(person)); 

    printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age); 

    return 0; 
} 
관련 문제