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