2012-03-29 2 views
0

я следующий код, который используют strdup функцию, когда функция strdup не работает?

#include<stdlib.h> 
#include<stdio.h> 
#include<string.h> 

char source[] = "The Source String "; 

int main() 
{ 
    char *dest; 
    if ((dest = _strdup(source)) == NULL) 
    { 
    fprintf(stderr, " Error allocation memory. "); 
    exit(1); 
    } 
    printf("The destination = %s\n", dest); 
    return 0; 
} 

успешно говорит строковый, но я интересно, в какой ситуации это не удается, и насколько хорошо это использование его в повседневных проблем? Я знаю, что strdup его определяется

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 
} 

если наша строка не NULL, есть ли шанс не суметь strdup функции?

+2

Будьте осторожны, вы используете '_strdup' вместо' strdup', и я не уверен, что вы знаете, почему. – Eregrith

+0

компилятор дал мне предупреждение об этом –

+2

@dato: Компилятор дал вам предупреждение о '_strdup' или о' strdup'? Функция 'strdup' не определяется стандартом C. Он определяется POSIX. Возможно, вам нужно что-то сделать, чтобы ваш компилятор распознал его, например '# define'ing какой-то символ. Использование '_strdup', а не' strdup', не является хорошим решением. –

ответ

2

Да, если malloc не может выделить память и возвращает NULL.

Это может произойти, если вы пытаетесь дублировать очень большую строку или если ваше адресное пространство очень фрагментировано и почти полное (так что taht malloc не может найти смежный блок памяти для выделения или встроенный системы, в которых не так много памяти доступно.

+0

когда это происходит? –

1

вероятность strdup провала попытки определяются вероятностью malloc неисправной. на современных операционных системах с виртуальной памятью, malloc неудачи очень редкой вещь. операционной системой может быть даже убить ваш весь процесс до того, как система станет настолько низкой в ​​памяти, что malloc должен вернуть NULL.

+2

Или, что еще хуже, ОС может [убить некоторый * другой * процесс] (http://linux-mm.org/OOM_Killer). –

1

Если нет утечки памяти, это не неслыханно. Так что неплохо было бы проверить наличие ошибки, распечатать сообщение об ошибке и, возможно, даже выйти в этот момент. Обратите внимание, что такие вещи, как «printf», не будут работать (или могут не работать, но по моему опыту не работают), если у вас закончилась нехватка памяти. Таким образом, вы должны использовать низкоуровневую «запись» или такую, и дескриптор файла, который вы используете (если вы пишете файл журнала), должен быть уже открыт.

Смежные вопросы