strdup() - C에서 무엇을 합니까?
의 목적은 무엇입니까?strdup()
C에서 기능합니까?
C 와 UNIX 가 단어를 할당하는 단축법에 익숙하다고 가정하면 문자열이 중복됩니다. :- )
실제로는 ISO C 표준(a) 자체의 일부가 아니라는 점에 유의하십시오(POSIX와 동일).다음 코드와 효과적으로 같은 동작을 하고 있습니다.
char *strdup(const char *src) {
char *dst = malloc(strlen (src) + 1); // Space for length plus nul
if (dst == NULL) return NULL; // No memory
strcpy(dst, src); // Copy the characters
return dst; // Return the new string
}
즉, 다음과 같습니다.
오래된 문자열(및 문자열의 끝을 표시하기 위한 "\0" 문자)을 유지하는 데 충분한 메모리를 할당하려고 합니다.
할당에 실패했을 경우는, 다음과 같이 설정됩니다.
errno
로.ENOMEM
및 반환NULL
지금 당장.설정errno
로.ENOMEM
무엇인가malloc
POSIX에서 하기 때문에 명시적으로 할 필요는 없습니다.strdup
POSIX에 준거하고 있지 않은 경우, ISO C는, 실제로, POSIX에 준거하고 있지 않습니다.ENOMEM
그래서(b) 안 넣었어요.그 이외의 경우는, 할당이 기능하기 때문에, 낡은(c) 스트링을 새로운 스트링에 카피하고, 새로운 주소(발신자가 어느 시점에서의 해방)를 반환합니다.
그것이 개념적 정의라는 것을 명심하세요.월급에 걸맞은 라이브러리 라이터라면 사용하고 있는 특정 프로세서를 대상으로 고도로 최적화된 코드를 제공할 수 있습니다.
(a) 단, 함수는 다음과 같이 시작합니다.str
및 소문자는 향후 지시를 위해 표준으로 예약되어 있습니다.부터C11 7.1.3 Reserved identifiers
:
각 헤더는 관련된 서브 절에 나열된 모든 식별자를 선언 또는 정의하고 *옵션으로 연관된 미래 라이브러리 방향에 나열된 식별자를 선언 또는 정의합니다.**
향후의 방향string.h
에서 볼 수 있다C11 7.31.13 String handling <string.h>
:
로 시작하는 함수 이름
str
,mem
, 또는wcs
및 소문자를 의 선언문에 추가할 수 있습니다.<string.h>
header를 클릭합니다.
그러니 안전하려면 다른 이름으로 불러야 할 거야
(b) 그 변경은 기본적으로 다음 두 가지를 대체하는 것입니다.if (d == NULL) return NULL;
포함:
if (d == NULL) {
errno = ENOMEM;
return NULL;
}
(c) 사용하는 것에 주의:strcpy
그 의도가 뚜렷이 드러나기 때문입니다.구현에 따라서는 (길이를 이미 알고 있기 때문에) 사용하는 것이 더 빠를 수 있습니다.memcpy
데이터를 더 큰 청크로 또는 병렬로 전송할 수 있습니다.또는 :-) 최적화 주문 #1: "측정, 추측하지 마십시오."
어떤 경우에도 그 루트를 선택하게 되면 다음과 같은 작업을 수행합니다.
char *strdup(const char *src) {
size_t len = strlen(src) + 1; // String plus '\0'
char *dst = malloc(len); // Allocate space
if (dst == NULL) return NULL; // No memory
memcpy (dst, src, len); // Copy the block
return dst; // Return the new string
}
char * strdup(const char * s)
{
size_t len = 1+strlen(s);
char *p = malloc(len);
return p ? memcpy(p, s, len) : NULL;
}
어쩌면 암호는 다른 코드보다 조금 더 빠를 수도 있습니다.strcpy()
처럼\0
char는 다시 검색할 필요가 없습니다(이미 와strlen()
).
다른 답변을 반복하는 것은 의미가 없습니다만, 주의해 주세요.strdup()
는 C의 관점에서 원하는 것은 무엇이든 할 수 있습니다.이는 C 표준의 일부가 아니기 때문입니다.단, POSIX.1-2001에 의해 정의되어 있습니다.
strdup man에서:
그strdup()
함수는 포인터를 새로운 문자열로 반환해야 합니다.이것은 다음 문자열이 가리키는 문자열의 복제입니다.s1
반환된 포인터는 다음 주소로 전달할 수 있습니다.free()
. 새 문자열을 만들 수 없는 경우 null 포인터가 반환됩니다.
strdup
그리고.strndup
POSIX 준거 시스템에서는 다음과 같이 정의됩니다.
char *strdup(const char *str);
char *strndup(const char *str, size_t len);
strdup() 함수는 문자열 복사에 충분한 메모리를 할당합니다.str
는 복사를 수행하고 포인터를 반환합니다.
이후 포인터는 함수에 대한 인수로 사용될 수 있습니다.free
.
사용 가능한 메모리가 부족한 경우NULL
반환되어errno
로 설정되어 있다.ENOMEM
.
strndup() 함수는 최대 복사 수len
문자열의 문자str
복사된 문자열을 끝내는 항상 null입니다.
strdup()은 끝 문자 '\0'을 포함한 문자 배열에 대해 동적 메모리 할당을 수행하고 힙 메모리의 주소를 반환합니다.
char *strdup (const char *s)
{
char *p = malloc (strlen (s) + 1); // allocate memory
if (p != NULL)
strcpy (p,s); // copy string
return p; // return the memory
}
따라서 메모리를 할당할 필요 없이 인수에 의해 지정된 문자열과 동일한 문자열을 얻을 수 있습니다.하지만 나중에 풀어줘야 해
스테이트먼트:
strcpy(ptr2, ptr1);
는 다음과 같습니다(단, 포인터가 변경되는 것은 제외).
while(*ptr2++ = *ptr1++);
반면:
ptr2 = strdup(ptr1);
는 다음과 같습니다.
ptr2 = malloc(strlen(ptr1) + 1);
if (ptr2 != NULL) strcpy(ptr2, ptr1);
따라서 복사한 문자열을 다른 함수(히프 섹션에 작성됨)에서 사용할 수 있습니다.strdup
,또 다른strcpy
이 정도면 충분합니다.
가장 중요한 것은 메모리(장소 및 크기)를 직접 할당할 필요 없이 첫 번째와 동일한 문자열을 하나 더 제공하는 것입니다.단, 전술한 바와 같이 해방해야 합니다(단, 수량 계산도 필요 없습니다).
strdup() 함수는 string duplicate의 약어로 파라미터를 문자열 상수 또는 문자열 리터럴로 받아들여 문자열에 충분한 공간만 할당하고 할당된 공간에 대응하는 문자를 쓴 후 마지막으로 할당된 공간의 주소를 호출 루틴으로 반환합니다.
전달된 문자열의 malloc 및 strcpy를 실행하여 전달된 문자열의 복사본을 만듭니다.malloc의 버퍼가 발신자에게 반환되기 때문에 반환값으로 빈칸을 실행해야 합니다.
언급URL : https://stackoverflow.com/questions/252782/strdup-what-does-it-do-in-c
'programing' 카테고리의 다른 글
Vue 및 Bootstrap 4에 행당 3장의 카드를 표시하는 방법 (0) | 2022.08.09 |
---|---|
조건이 충족되는 경우에만 슬롯의 폴백 콘텐츠 사용 (0) | 2022.08.09 |
JavaBeans가 사용되는 장소? (0) | 2022.08.09 |
javac 옵션: 지정된 디렉토리 아래에 있는 모든 Java 파일을 재귀적으로 컴파일합니다. (0) | 2022.08.09 |
webpack 2 및 vue-cli를 사용하여 로컬 글꼴로 로드 (0) | 2022.08.09 |