c언어에서 strcpy 와 memcpy 차이는 무엇일까요?

c언어에서 strcpy 와 memcpy 차이는 무엇일까요?

성능적으로 어떤것이 더 빠를까요?

인자의 차이는 2개와 3개 차이인데..

언제 어떻게 활용해야 하는지 말씀해주세요.

주의할 점이 있는지 등을 답변부탁드립니다.

고수님들.

    6개의 답변이 있어요!

    • strcpy는 문자열에 한하여 소스에서 목적지 버퍼로 복사를 수행하는함수라생각하시면 되고,

      memcpy는 문자열이 아니더라도 사이즈만큼을 목적버퍼로 복사할수 있습니다.

      성능의 경우는 원론적으로는 memcpy가 더빠른것으로 알려져 있습니다만,

      일반적으로는 활용용도에 따라 쓰시면됩니다.

      참고적으로, strcpy 보다는 snprintf가 안전하여 현업에서 이함수를 보다 많이 쓰거나 권장되기도합니다.

    • memcpy는 memory block을 복사합니다. size가 정해져 있어서 뭔가 최적화룰 할 때 우선적 대상이구요.

      strcpy는 말 그대로 string이라고 불리는 특수한 자료구조를 복사하는 함수입니다. string은 char array로 문자열의 끝은 "\0"이라는 특수 문자가 항상 있습니다. 없으면 strcpy는 system memory 전체를 복사할 수도 있습니다.

    • 제 경험상으로는 strcpy는 학교 과제 할 때 외에는 잘 사용하지 않게 됩니다.

      strcpy의 prototype은 아래와 같습니다.

      char *strcpy(char *restrict dest, const char *src);

      src에 \0 를 만날때까지 그 데이터를 dest에 복사 하는 것이죠

      memcpy의 prototype은 아래와 같습니다.

      void *memcpy(void *restrict dest, const void *restrict src, size_t n);

      src 에 있는 데이터를 size_t 에 해당하는 n byte 만큼 dest 로 복사한다 입니다.

      오류가 발생할 만한 이유가 dest 의 사이즈가 작거나 src에 \0 가 없는 경우가 대표적인데

      샘플용 프로그램에서는 오류가 발생할 일이 거의 없기도 합니다.

      위 소스를 컴파일 하면 컴파일 오류도 안나고

      test 를 입력 받아서 strcpy 해도 result의 사이즈는 2바이트보다 큰 값도 잘 출력 됩니다.

      왜냐면 컴파일러가 두 변수의 메모리 영역을 알아서 떨어트려 주거든요

      근데 문제는 프로그램 사이즈가 커지고 포인터와 같이 메모리 변수들이 많아지면 heap 영역의 공간 부족으로 서로의 영역을 침범하는 사태가 발생합니다.

      그럼 stack overflow나 segment fault 같은 오류가 발생하죠

      그래서 오류가 적은 프로그램을 만들기 위해 memcpy를 통해 내가 복사할 바이트 수를 정확하게 지정해 주는 게 좋습니다.

      결국은 습관의 차이 입니다. 변수 선언부터 예외처리 같은 부분이 귀찮고 사소해 보일 수 있지만 오류 없는 프로그램을 만들기 위한 아주 중요한 요소 입니다.

      정리 하면 기능상의 차이는 없으나 제 기준에서는 현재 strcpy는 사용하지 않는다 입니다.

    • 하는 기능은 거의 비슷하다고 생각하시면됩니다.
      strcpy()는 문자열 복사하는 것입니다. 사용이 문자열에
      한정됩니다. 하지만 memcpy()의 경우 메모리의 일정부분을 복사하는 것입니다. 효율면에서도 memcpy() 가 메모리에 직접 접근하기 때문에 더 빠른걸로 알고 있습니다. 답변이 도움이 되셨길 바랍니다.

    • strcpy 와 memcpy는 문자열을 복사하는 함수입니다.

      속도측면에서는 memcpy가 조금 빠르다고 하지만 거의 속도차이를 느낄수 없습니다.

      다만 memcpy의 경우 복사하려는 문자열의 길이를 인자로 지정해야하므로, 잘못된 문자열 복사로 인한 오류를 줄일수 있습니다

      strcpy 를 사용하는 경우 소스상에는 이상이 없어 보이더라도,

      변수에 값이 잘못들어가거나 종료문자 '₩0' 가 문자열에 포함되지 않는 경우 엉뚱한 값이 들어가는 경우 많아

      디버깅시 힘든 경우가 많습니다.

      따라서 C로 문자열 복사를 하실경우 인자로 길이를 지정하는 strncpy나 memcpy 사용을 추천드립니다.

    • 안녕하세요!

      strcpy 는 스트링을 복사할 때 주로 사용되고 , memcpy 바이너리스트링을 복사할 때 주로 사용됩니다.

      strcpy는 문자열의 끝을 알리는 0x00 을 만나면 복사를 중지합니다.

      memcpy는 상관없이 무조건 갯수만큼 복사를 하게 됩니다.

      memcpy는 cs레지스터를 사용하여 고속 복사가 가능하고

      strcpy는 string 의 끝을 체크해야하기 떄문에 고속복사가 불가능합니다.