강박 대 강박.
난 그걸 읽었다.strcpy
문자열을 복사하기 위한 것이며strdup
새 문자열로 포인터를 반환하여 문자열을 복제하십시오.
어떤 케이스를 사용하고 싶으신지 설명해 주시겠습니까?strcpy
어떤 경우를 사용하시겠습니까?strdup
?
strcpy(ptr2, ptr1)
와 같다while(*ptr2++ = *ptr1++)
질질 끄는 것과 같은 경우
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
(memcpy 버전이 더 효율적일 수 있음
따라서 복사한 문자열이 힙 섹션에서 생성되므로 다른 함수에 사용되도록 하려면 strupping을 사용하면 된다.
기능strcpy
그리고strncpy
C 표준 라이브러리의 일부로서 기존 메모리에서 작동한다.즉, 함수가 문자열 데이터를 복사하는 메모리를 제공해야 하며, 코롤러리로서 필요한 메모리가 어느 정도인지 알아낼 수 있는 자신만의 방법이 있어야 한다.
항상 그렇듯이,strdup
Posix 함수로 동적 메모리 할당을 수행함.그것은 문자열을 복사한 새로 할당된 메모리로 포인터를 되돌린다.하지만 이제 당신은 이 기억의 책임을 져야 하고 결국에야free
그럭저럭
그렇게 되다strdup
「hidden」의 한 사람.malloc
"편리함수, 그리고 그것이 아마도 그것이 표준 도서관의 일부가 아닌 이유일 것이다.표준 라이브러리를 사용하는 한, 당신은 반드시 하나를 호출해야 한다는 것을 알고 있다.free
매사에malloc
/calloc
. 그러나 다음과 같은 기능들strdup
감춰진 것을 소개하다.malloc
, 그리고 당신은 그것을 a와 동등하게 취급해야 한다.malloc
메모리 관리를 목적으로 하는 것. (또 다른 숨겨진 할당 기능은 GCC의 것이다.abi::__cxa_demangle()
.) 조심하라!
strdup
를 사용하는 동안 힙의 새 문자열에 대해 메모리 할당strcpy
(또는 더 안전하다)strncpy
varient) 힙이나 스택의 사전 할당된 메모리에 문자열을 복사할 수 있다.
수용된 답변에서, 의 이행은 다음과 같다.strdup
다음과 같이 제시된다.
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
그러나, 그것은 두 가지 모두 그렇기에 다소 차선책이다.strlen
그리고strcpy
각 문자가 a자인지 확인하여 문자열 길이를 찾을 필요가 있다.\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
돌아오다NULL
.
참조URL: https://stackoverflow.com/questions/14020380/strcpy-vs-strdup
'programing' 카테고리의 다른 글
반올림 정수 분할(잘리는 대신) (0) | 2022.05.11 |
---|---|
휘발성 대 원자성 (0) | 2022.05.11 |
AJAX 호출을 위해 Vuex Store 데이터를 준비하는 적절한 방법 (0) | 2022.05.10 |
왜 C연합이 필요한가? (0) | 2022.05.10 |
C에서 NULL 포인터를 해제하는 것이 좋은 관행인가? (0) | 2022.05.10 |