2016-09-30 2 views
0

나는 한 ptr에서 다른 ptr로 memcpy하려고합니다. 나는 복사하고 싶은 크기를 안다. 대상 포인터와 소스 포인터는 모두 void 포인터입니다. 이게 유효합니까? 원본에서 대상으로 ELEMENT_SIZE (128과 같은 정수)를 실제로 복사합니까? 나는 이것이 가장 이상적인 일이 아니라는 것을 알고 있습니다. 그러나 이것이 효과가 있는지 알고 싶습니다.memcpy는 void 포인터로 어떻게 작동합니까?

memcpy(to_add, element_ptr, ELEMENT_SIZE); 
+1

예. 작동합니다. 해당 바이트 수에 걸쳐 문자 포인터를 반복하는 것과 동일하게 작동합니다. –

+2

왜 'memcpy'가 void 포인터를 받아들이도록 정의되었다고 생각하면 작동하지 않을 것이라고 생각하십니까? – kaylum

+0

시도해보십시오. 작동하지 않는다면 작동 할 것이므로, [mcve]로 SO에게 다시 돌아 오십시오. –

답변

0

실제로 어떤 포인터인지는 중요하지 않습니다. 이것은 두 개의 메모리 주소를 갖고 사본을 첨부하는 매우 평범한 프로세스입니다.

1

매개 변수 설명 :

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

destination : 포인터 컨텐츠를 복사 할 대상 배열, 유형

는 참조 링크를 참조하십시오 - void * 유형의 포인터에 캐스팅됩니다.

source : 복사 할 데이터 소스에 대한 포인터이며 const void * 유형의 포인터로 형식 형변환됩니다.

num : 복사 할 바이트 수. size_t는 부호없는 정수 유형입니다.

memcpy은 단순히 주소 destination에서 시작하는 주소 source 및 메모리에 복사를 시작 num 바이트를합니다.

포인터는 유형에 관계없이 고정 길이 메모리 주소입니다. 포인터가 char * (문자 데이터를 가리킴), int * (정수 데이터를 가리킴) 또는 void * (알 수없는 유형의 데이터를 가리킴)인지 여부는 중요하지 않습니다. 여전히 메모리를 가리키고 있습니다.

memcpy은 명시적인 바이트 수를 복사하기 때문에, 가리키는 데이터의 유형은 부적절합니다. 데이터에 메모리 주소 만 있으면됩니다.