2012-03-29 3 views
0

i folgenden Code haben, die es strdup Funktionwenn die strdup-Funktion fehlschlägt?

#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; 
} 

The Source String erfolgreich sagt, aber ich bin interessant, in welcher Situation sie versagt und wie gut es ist die Nutzung von es in der täglichen Probleme? Ich weiß, dass es strdup wird bestimmt durch

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 
} 

wenn unsere Zeichenkette nicht NULL ist, gibt es irgendeine Wahrscheinlichkeit des Scheiterns der strdup Funktion?

+2

Seien Sie vorsichtig, Sie verwenden '_strdup' anstelle von' strdup' und ich bin mir nicht sicher, Sie wissen warum. – Eregrith

+0

Compiler gab mir eine Warnung darüber –

+2

@Dato: Der Compiler gab Ihnen eine Warnung über '_strdup' oder über' strdup'? Die 'strdup'-Funktion ist nicht durch den C-Standard definiert. Es wird von POSIX definiert. Möglicherweise müssen Sie etwas tun, damit Ihr Compiler es erkennt, wie zum Beispiel '# definieren' irgendein Symbol. '_strdup' anstatt' strdup' zu verwenden, ist keine gute Lösung. –

Antwort

2

Ja, wenn malloc keinen Speicher zuweist und NULL zurückgibt.

Dies kann vernünftigerweise passieren, wenn Sie versuchen, eine sehr große Zeichenfolge zu duplizieren, oder wenn Ihr Adressraum sehr fragmentiert und fast voll ist (so malloc kann nicht einen zusammenhängenden Speicherblock zu finden, oder in eingebettet Systeme, bei denen auf nicht viel Speicher.

+0

wenn es passiert? –

1

die Chance strdup andernfalls bestimmt wird durch die Möglichkeit von malloc scheitern. modernen Betriebssystemen mit virtuellem Speicher, ein malloc Versagen ist eine sehr seltene Sache. Das Betriebssystem kann sogar getötet verfügbar ist Ihr Gesamtprozess, bevor das System so wenig Speicher belegt, dass mallocNULL zurückgeben muss

+2

Oder schlimmer, das Betriebssystem kann [einige * andere * Prozess] töten (http://linux-mm.org/OOM_Killer). –

1

Es ist nicht unüblich, dass kein Speicher mehr zur Verfügung steht, wenn ein Speicherleck vorliegt. Es ist also keine schlechte Idee, nach Null zu suchen, eine Fehlermeldung auszugeben und vielleicht sogar an diesem Punkt zu beenden. Beachten Sie, dass Dinge wie "printf" nicht funktioniert (oder funktioniert möglicherweise nicht, aber meiner Erfahrung nach nicht funktionieren), wenn Sie nicht genügend Arbeitsspeicher haben. Sie müssen Low-Level-Schreibzugriffe oder solche verwenden, und der Dateideskriptor, den Sie verwenden (wenn Sie in die Protokolldatei schreiben), sollte bereits geöffnet sein.