memmove에 대해 읽는 동안 나는 처리 할 수 있다고 읽었습니다. 메모리 오버랩 그러나 두 개의 문자열 사이에서 어떻게 memorory overlap이 발생할 수 있는지, 어떻게이 함수가 메모리 블록을 올바르게 복사 할 수 있는지 알 수 없습니다.메모리 겹침은 어떻게 발생하며 어떻게 제어됩니까?
답변
"메모리 오버랩"자체적으로 발생하지 않습니다. 겹치는 메모리 영역이있는 memmove
함수를 제공 할 수있는 것은 당신입니다. 두 포인터를 같은 배열로 가져 가면 중복 메모리 영역으로 쉽게 끝날 수 있습니다.
물론 노동 조합을 통해 중복되는 객체를 쉽게 만들 수도 있습니다.
질문의 두 번째 부분 ("이 기능으로 메모리 블록을 올바르게 복사 할 수있는 방법")이 무슨 뜻인지 명확하지 않습니다. 여기서 문제는 어디서 볼 수 있습니까?
memmove(p+1, p, 42);
끝에서 시작하여 바이트를 이동해야하는 경우. Memcpy()는 그것을 엉망으로 만든다.
엄밀히 말하면,'memcpy'는 이런 식으로 사용되면 정의되지 않은 동작을합니다. 예를 들어 거꾸로 복사하는 것이 더 빠르다거나'memcpy'가'memmove' 호출로 구현되었다고 가정하면 쓰일 수 있지만, 결코 그런 것에 의존해서는 안됩니다. :-) –
memmove를 알고 있다면 memcpy를 사용하는 이유는 무엇입니까?) –
memcpy()가 빠르기 때문에 왜 memcpy를 사용합니까? –
나는 어떻게 함수가 메모리 오버랩 문제를 처리 할까? –
소스가 다른 버퍼에 복사 된 다음 대상에 복사 된 것처럼 작동한다. Memcpy()는 소스를 직접 목적지에 복사합니다. – Jefferson