strdup () - что он делает в C?

какова цель strdup() функция в C?

10 ответов


именно то, что это звучит, предполагая, что вы привыкли к сокращенному способу, которым C и UNIX присваивает слова, это дубликаты строк :-)

имея в виду, что на самом деле это не часть самого стандарта ISO C(a) (это вещь POSIX), она эффективно делает то же самое, что и следующий код:

char *strdup (const char *s) {
    char *d = malloc (strlen (s) + 1);   // Space for length plus nul
    if (d == NULL) return NULL;          // No memory
    strcpy (d,s);                        // Copy the characters
    return d;                            // Return the new string
}

другими словами:

  1. он пытается выделить достаточно памяти для хранения старая строка (плюс символ "\0", чтобы отметить конец строки).

  2. если распределение не удалось, он устанавливает errno to ENOMEM и возвращает NULL немедленно. Установка errno to ENOMEM что-то malloc делает в POSIX, поэтому нам не нужно явно делать это в нашем strdup. Если ты не POSIX совместимый, ISO C фактически не санкционирует существование ENOMEM поэтому я не включил это вот!--26-->(b).

  3. в противном случае распределение работало, поэтому мы копируем старую строку в новую строку и возвращаем новый адрес (который вызывающий отвечает за освобождение в какой-то момент).

имейте в виду, что это концептуальное определение. Любой писатель библиотеки, достойный их зарплаты, мог предоставить сильно оптимизированный код, нацеленный на конкретный используемый процессор.


(a) Keep in однако ум, который функционирует, начиная с str и строчная буква зарезервированы стандартом для будущих направлений. От C11 7.1.3 Reserved identifiers:

каждый заголовок объявляет или определяет все идентификаторы, перечисленные в его связанном подпункте, и *необязательно объявляет или определяет идентификаторы, перечисленные в его связанном подразделе будущие направления библиотеки.**

будущие направления string.h можно найти в C11 7.31.13 String handling <string.h>:

имена функций, которые начинаются с str, mem или wcs и строчная буква может быть добавлена к объявлениям в .


(b) изменение в основном будет заменять if (d == NULL) return NULL; С:

if (d == NULL) {
    errno = ENOMEM;
    return NULL;
}

char * strdup(const char * s)
{
  size_t len = 1+strlen(s);
  char *p = malloc(len);

  return p ? memcpy(p, s, len) : NULL;
}

возможно код немного быстрее, чем с strcpy() как char не нужно искать снова (это уже было с strlen()).


нет смысла повторять другие ответы, но обратите внимание, что strdup() можно делать все, что хочет, с точки зрения C, так как он не является частью стандарта C. Однако он определяется POSIX.1-2001.


С использованием strdup человек:

на strdup() функция возвращает указатель на новую строку, которая является дубликатом строки, на которую указывает s1. Возвращенный указатель может быть передан в free(). Возвращается указатель null, если новая строка не создается.


Он делает дубликат копии строки, переданной при запуске Танос и strcpy переданной строки. Буфер malloc'Ed возвращается вызывающему объекту, следовательно, необходимо запустить свободный на возвращаемое значение.


strdup () выполняет динамическое выделение памяти для массива символов, включая конечный символ "\0", и возвращает адрес памяти кучи:

char *strdup (const char *s)
{
    char *p = malloc (strlen (s) + 1);   // allocate memory
    if (p != NULL)
        strcpy (p,s);                    // copy string
    return p;                            // return the memory
}

таким образом, он дает нам другую строку, идентичную строке, заданной его аргументом, не требуя от нас выделения памяти. Но мы все равно должны освободить его позже.


strdup и strndup определяются в системах, совместимых с POSIX, как:

char *strdup(const char *str);
char *strndup(const char *str, size_t len);

на strdup () функция выделяет достаточную память для копии строка str, делает копию и возвращает указатель на него.

указатель впоследствии может использоваться в качестве аргумента функции free.

если недостаточно памяти,NULL и errno установлено ENOMEM.

в strndup() функция копирует максимум len символы из строки str всегда null завершает скопированную строку.


самое ценное, что он делает, это дать вам другую строку, идентичную первой, без необходимости выделять память (местоположение и размер) самостоятельно. Но, как уже отмечалось, вам все равно нужно освободить его (но это также не требует расчета количества.)


функция strdup () является сокращением для дубликата строки, она принимает параметр в качестве Строковой константы или строкового литерала и выделяет достаточно места для строки и записывает соответствующие символы в выделенное пространство и, наконец, возвращает адрес выделенного пространства вызывающей подпрограмме.


Это просто strcpy(ptr2, ptr1) эквивалентно while(*ptr2++ = *ptr1++)

где: strdup эквивалентно

ptr2 = malloc(strlen(ptr1)+1);

strcpy(ptr2,ptr1);

поэтому, если вы хотите, чтобы строка, которую вы скопировали, использовалась в другой функции (как она создана в разделе кучи), вы можете использовать strdup, иначе strcpy достаточно