и strcpy против использованием strdup

Я читал, что strcpy предназначен для копирования строки и strdup возвращает указатель на новую строку, чтобы повторяющиеся строки.

не могли бы вы объяснить, какие случаи вы предпочитаете использовать strcpy и какие случаи вы предпочитаете использовать strdup?

5 ответов


strcpy(ptr2, ptr1) эквивалентно while(*ptr2++ = *ptr1++)

где as strdup эквивалентно

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

(версия memcpy может быть более эффективным)

поэтому, если вы хотите, чтобы строка, которую вы скопировали, использовалась в другой функции (как она создана в разделе кучи), вы можете использовать strdup, иначе strcpy достаточно.


функции strcpy и strncpy являются частью стандартной библиотеки C и работают с существующей памятью. То есть, вы необходимо предоставить память, в которую функции копируют строковые данные, и, как следствие,вы должен иметь свои собственные средства, чтобы узнать, сколько памяти вам нужно.

по constrast,strdup является функцией Posix, и она выполняет динамическое выделение памяти для вас. Он возвращает указатель на вновь выделенную память, в которую он скопировал строку. Но!--14-->вы теперь отвечают за эту память и должны в конечном итоге free его.

, что составляет strdup один из "скрытых malloc" функции удобства, и это, по-видимому, также, почему он не является частью стандартной библиотеки. Пока вы используете стандартную библиотеку, вы знаете, что вы должны вызвать one free для каждого malloc/calloc. Но такие функции, как strdup ввести скрытый malloc, и вы должны относиться к нему так же как malloc для управления памятью. (Еще одна такая скрытая функция распределения-gcc abi::__cxa_demangle().) Будьте осторожны!


strdup выделяет память для новой строки в куче, при использовании strcpy (или его безопаснее strncpy varient) я могу скопировать строку в предварительно выделенную память на или в куче или в стеке.


на принято отвечать реализация strdup представлено в виде:

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

однако это несколько неоптимально, потому что оба strlen и strcpy необходимо найти длину строки, проверив, является ли каждый символ .

используя 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д возвратить NULL на провал. Если память не выделена, копировать не удается strdup return NULL.