strcpy 대 strdup
나는 strcpy
문자열을 복사하기 위해 읽었고 strdup
문자열을 복제하기 위해 새 문자열에 대한 포인터를 반환합니다.
어떤 케이스를 선호 strcpy
하고 어떤 케이스 를 선호하는지 설명해 주 strdup
시겠습니까?
strcpy(ptr2, ptr1)
다음과 같다 while(*ptr2++ = *ptr1++)
strdup은 다음과 같습니다.
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
( memcpy 버전 이 더 효율적일 수 있음)
따라서 복사 한 문자열을 다른 함수에서 사용하려면 (힙 섹션에서 생성 된대로) strdup을 사용할 수 있습니다. 그렇지 않으면 strcpy로 충분합니다.
기능 strcpy
과 strncpy
는 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
원래 문자열의 크기에 저장소를 할당합니다. 스토리지 할당이 성공하면 원래 문자열이 중복 문자열에 복사됩니다.
strdup
d NULL
실패시 반환 . 메모리가 할당되지 않은 경우 복사 실패 strdup
return NULL
.
참고 URL : https://stackoverflow.com/questions/14020380/strcpy-vs-strdup
'Nice programing' 카테고리의 다른 글
구성 변환을 사용하여 ConnectionString을 제거하는 방법 (0) | 2020.11.16 |
---|---|
div 내에서 두 줄로만 텍스트 감싸기 (0) | 2020.11.16 |
인수 'fn'은 문자열이있는 함수가 아닙니다. (0) | 2020.11.16 |
CentOS 6.5 (최종)에서 PHP 업그레이드 (0) | 2020.11.16 |
Ruby 인스턴스 변수는 언제 설정 되나요? (0) | 2020.11.16 |