2011-03-15 6 views
5

괜찮습니까?memcpy 복사 자체가 부분적으로 복사

char buf[] = { 0, 1, 2 }; 
memcpy(buf, buf + 1, 2); 

큰 데이터 유형은 어떤 차이가 있습니까? 나는 memmove()를 사용할 수 있다는 것을 알고 있지만, 나는 단지 궁금하다.

+0

-1 : 시도했을 때 무슨 hapenned? – pmg

+3

+1, 왜냐하면 나는 pmg의 -1에 동의하지 않기 때문입니다. "당신이 표준에서 그것을 보았을 때 어떤 일이 일어 났습니까?", 어쩌면,이 종류의 것을 실험 해보고 시도해 볼 수 있고 결과가''1,2,2, '버퍼에서. 그렇다면 그것을 사용하는 데 필요한 조언은 무엇입니까? 다음 주 또는 최적화를 실행하거나 고객의 컴퓨터에서 계속 작동합니까? –

+0

@ 스티브 제시솝 ​​: 나는 동의한다. OP의 예제는 (아마도)'memcpy'의 특정 타겟 플랫폼 구현에 따라 작동 할 것입니다,하지만 그건 좋은 생각이 아닙니다! – GrahamS

답변

12

memcpy의 효과는 입출력이 겹칠 때 정의되지 않습니다. memmove을 사용해야합니다.

5

아니요. 이어야하며 소스와 대상이 겹치는 경우 memmove을 사용해야합니다.

은 컴파일러의 구현에 따라 memcpy과 작동하지만 의존하지 않아도됩니다! 당신의 memcpy(buf, buf + 1, 2)

typedef unsigned char uint8; 

void * memcpy (void * destination, const void * source, size_t num) 
{ 
    const uint8* pSrc = (const uint8*)source; 
    const uint8* const pSrcEnd = pSrc + num; 
    uint8* pDst = (uint8*)destination; 

    while (pSrc != pSrcEnd) 
     *(pDst++) = *(pSrc++); 

    return destination; 
} 

괜찮 작동,하지만 덜과 memcpy(buf + 1, buf, 2)

3

:


전형적인 순진 구현은이 같은 바이트 별 사본 (UINT8)을 수 있습니다 메모리 영역이 겹쳐지면 동작이 정의되지 않으므로이 상태가 좋지 않습니다.

1

그것은 정의되지 않은 동작입니다,하지만 난 그렇게처럼 사용하고, 대상의 종료 시점 소스의 시작 지점보다 작은

char buf[] = {0, 1, 2, 3); 
memcpy(buf, buf+2, 2); 

. 당신은 확실히 memmove를 사용해야합니다 ...

+0

GNU C 라이브러리는 memcpy의 구현을 몇 번 바꿨습니다. 때로는 i686 vs i386 vs x86_64와 다른 점도 있습니다. –