и 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, и она выполняет динамическое выделение памяти для вас. Он возвращает указатель на вновь выделенную память, в которую он скопировал строку. Но вы теперь отвечают за эту память и должны в конечном итогеfree
его., что составляет
strdup
один из "скрытыхmalloc
" функции удобства, и это, по-видимому, также, почему он не является частью стандартной библиотеки. Пока вы используете стандартную библиотеку, вы знаете, что вы должны вызвать одинfree
для каждогоmalloc
/calloc
. Но такие функции, какstrdup
ввести скрытыйmalloc
, и вы должны относиться к нему так же какmalloc
с целью управления памятью. (Еще одна такая скрытая функция распределения-это GCCabi::__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); }