Nice programing

strcpy 대 strdup

nicepro 2020. 11. 16. 22:09
반응형

strcpy 대 strdup


나는 strcpy문자열을 복사하기 위해 읽었고 strdup문자열을 복제하기 위해 새 문자열에 대한 포인터를 반환합니다.

어떤 케이스를 선호 strcpy하고 어떤 케이스 를 선호하는지 설명해 주 strdup시겠습니까?


strcpy(ptr2, ptr1) 다음과 같다 while(*ptr2++ = *ptr1++)

strdup은 다음과 같습니다.

ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);

( memcpy 버전 이 더 효율적일 수 있음)

따라서 복사 한 문자열을 다른 함수에서 사용하려면 (힙 섹션에서 생성 된대로) strdup을 사용할 수 있습니다. 그렇지 않으면 strcpy로 충분합니다.


기능 strcpystrncpy는 C 표준 라이브러리의 일부이며 기존의 메모리에서 작동합니다. 즉, 당신은 기능이 문자열 데이터를 복사되는 메모리를 제공해야하며, 추론으로, 당신은 당신이 필요로하는 메모리 양을 알아내는 자신 만의 방법을 가지고 있어야합니다.

constrast strdup는 Posix 함수이며 동적 메모리 할당을 수행합니다. 문자열을 복사 한 새로 할당 된 메모리에 대한 포인터를 반환합니다. 그러나 이제 여러분 은이 기억에 대한 책임이 있으며 결국에는 free그렇게 해야 합니다.

그것은 strdup"숨겨진 malloc"편의 기능 중 하나를 만들고 아마도 이것이 표준 라이브러리의 일부가 아닌 이유이기도합니다. 표준 라이브러리를 사용하는 한 free모든 malloc/에 대해 하나씩 호출해야한다는 것을 알고 있습니다 calloc. 그러나 strdup숨겨진 도입하는 것과 같은 기능 은 메모리 관리를 위해 을와 malloc동일하게 처리해야합니다 malloc. (그런 숨겨진 또 다른 할당 기능은 GCC의 abi::__cxa_demangle()입니다.) 조심하세요!


strdup할당 된 힙에 새 문자열에 대한 메모리를 사용하는 동안 strcpy(또는 안전 strncpy세인 것을) 나는에 미리 할당 된 메모리에 문자열을 복사 할 수 있습니다 중 하나를 힙 또는 스택.


에서 허용 대답 의 구현 strdup으로 제공됩니다 :

ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);

그러나, 다소 차선 모두 있기 때문에 strlen그리고 strcpy각각의 캐릭터가 인 경우 확인하여 문자열의 길이를 찾아야합니다 \0.

사용하는 memcpy것이 더 효율적이어야합니다.

char *strdup(const char *src) {
    size_t len = strlen(src) + 1;
    char *s = malloc(len);
    if (s == NULL)
        return NULL;
    return (char *)memcpy(s, src, len);
}

char *strdup(char *pszSrch);

strdup원래 문자열의 크기에 저장소를 할당합니다. 스토리지 할당이 성공하면 원래 문자열이 중복 문자열에 복사됩니다.

strdupd NULL실패시 반환 . 메모리가 할당되지 않은 경우 복사 실패 strdupreturn NULL.

참고 URL : https://stackoverflow.com/questions/14020380/strcpy-vs-strdup

반응형