и 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(или его безопаснееstrncpyvarient) я могу скопировать строку в предварительно выделенную память на или куча или стек.
на принято отвечать реализация
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); }