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



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

875   10  

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 до ENOMEM и возвращает NULL немедленно. Установка errno до ENOMEM что-то malloc делает в POSIX, поэтому нам не нужно явно делать это в нашем strdup. Если ты не POSIX совместимый, ISO C фактически не требует существования ENOMEM поэтому я не включил это здесь(b).

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

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


(a) сохранить в однако имейте в виду, что функции начинаются с 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 man:

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

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

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);

The 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 достаточно

Comments

    Ничего не найдено.