и 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.