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


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

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

5 61

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 с целью управления памятью. (Еще одна такая скрытая функция распределения-это 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.