2016-11-21 9 views
-2

내 자신의 memcopy 버전을 구현하라는 요청을 받았습니다. 이것은 내가 인터넷에서 발견 한 것입니다. 우리가 혼란스럽게 생각하는 것은 두 개의 void * 포인터가 있다는 것입니다. 왜 우리는 char*에 그들을 타입 변환합니까?memcopy 구현

이 정보가 정확합니까?

// A C implementation of memcpy() 
#include<stdio.h> 
#include<string.h> 


    void myMemCpy(void *dest, void *src, size_t n) 
    { 
     // Typecast src and dest addresses to (char *) 
     char *csrc = (char *)src; 
     char *cdest = (char *)dest; 

     // Copy contents of src[] to dest[] 
     for (int i=0; i<n; i++) 
      cdest[i] = csrc[i]; 
    } 
+10

재미 "나는 memcopy 내 자신의 버전을 구현하기 위해 질문을 받았다.이 내가 인터넷에서 찾을 것입니다."입니다 :) –

+1

기술적으로 그것이 '해야 'char' 대신'unsigned char'을 사용합니다. – EOF

+1

@Anni_housie 아마도 memcpy를 의미할까요? :) –

답변

0

당신은 "유형"void는 크기가 없기 때문에 (void *이하는 마음)을 타입 변환해야합니다.

그러면 루프는 한 번에 char (이상적으로는 1 바이트)을 이동할 수 있습니다.

3

void * 유형의 포인터를 역 참조 할 수 없으므로 캐스트가 필요합니다. 따라서 src이 유형 void *의 포인터 인 경우 예를 들어 src[i]을 작성할 수 없습니다. void 형식은 불완전한 형식입니다.

함수의 경우 잘못된 것입니다.

당신은 당신이

void * memcpy(void * restrict s1, const void * restrict s2, size_t n); 
^^^^^^       ^^^^^^^^^^^ 

는 따라서 당신에 의해 작성된 함수가 적어도

void * memcpy(void *s1, const void *s2, size_t n); 

기능과 같아야 같이 선언 된 것을 볼 수 memcpy 표준 함수의 선언을 보면 정의는이 시범 프로그램에서 보여지는 것처럼 보일 수 있습니다.

#include <stdio.h> 

void * myMemCpy(void *s1, const void *s2, size_t n) 
{ 
    const unsigned char *src = s2; 
    unsigned char *dsn = s1; 

    while (n--) *dsn++ = *src++; 

    return s1; 
} 

int main(void) 
{ 
    char s1[] = "Hello"; 
    char s2[sizeof(s1)]; 

    puts((char *)myMemCpy(s2, s1, sizeof(s1))); 

    return 0; 
} 

프로그램 출력은

Hello 
+2

첫 번째 문장에서'void pointer'를 사용 했습니까? – EOF

+0

@EOF 오타입니다. 고마워. :) –

+0

정말 고맙다는 말인데,'while()'- 조건에서 끔찍하고 쓸모없는'! = 0'을 제거 할 것이다. 나는 C#과 Java를 너무 많이 사용하여 최근 아름다운 C가 그렇게 좋아지기를 원하지 않는다. – EOF