programing

strdup() - C에서 무엇을 합니까?

newsource 2022. 8. 9. 23:05

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
}

즉, 다음과 같습니다.

  1. 오래된 문자열(및 문자열의 끝을 표시하기 위한 "\0" 문자)을 유지하는 데 충분한 메모리를 할당하려고 합니다.

  2. 할당에 실패했을 경우는, 다음과 같이 설정됩니다.errno로.ENOMEM및 반환NULL지금 당장.설정errno로.ENOMEM무엇인가mallocPOSIX에서 하기 때문에 명시적으로 할 필요는 없습니다.strdupPOSIX에 준거하고 있지 않은 경우, ISO C는, 실제로, POSIX에 준거하고 있지 않습니다.ENOMEM그래서(b) 안 넣었어요.

  3. 그 이외의 경우는, 할당이 기능하기 때문에, 낡은(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()처럼\0char는 다시 검색할 필요가 없습니다(이미 와strlen()).

다른 답변을 반복하는 것은 의미가 없습니다만, 주의해 주세요.strdup()는 C의 관점에서 원하는 것은 무엇이든 할 수 있습니다.이는 C 표준의 일부가 아니기 때문입니다.단, POSIX.1-2001에 의해 정의되어 있습니다.

strdup man에서:

strdup()함수는 포인터를 새로운 문자열로 반환해야 합니다.이것은 다음 문자열이 가리키는 문자열의 복제입니다.s1반환된 포인터는 다음 주소로 전달할 수 있습니다.free(). 새 문자열을 만들 수 없는 경우 null 포인터가 반환됩니다.

strdup그리고.strndupPOSIX 준거 시스템에서는 다음과 같이 정의됩니다.

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