2016-07-05 8 views
1

Ich versuche, char * und const Zeichenfolge verketten, aber das System hängt. Folgendes ist der CodeVerketten mit C-Funktion zu großen char *

unsigned long long size = 2*pow(10,18); 
char* string = malloc(size);  
strcat(string," "); 

Ich bin mir nicht sicher, wie Sie den Fehler beheben. Verwenden Dev C/C++ in Windows 10.

Edit: Vielen Dank für Ihre Kommentare und Antworten. Ich habe die Änderung in meinem Code vorgenommen. Aber es gibt immer noch das gleiche Problem. Die Anweisung wird nicht gedruckt und bleibt weiterhin hängen.

char* string = malloc(20*sizeof(char)); 
if(string=NULL){ 
    printf("unsuccessful memory allocation"); 
} 

strcat(string," "); 
+3

Prüfung für Rückgabewert von 'malloc()' ... 'if (string == NULL) printf ("nicht erfolgreiche Speicherzuweisung"); ' – Cherubim

+3

then' * string = 0; 'oder kopiere die Zeichenfolge vor' strcat'. – BLUEPIXY

+1

Der wahrscheinlichste Grund ist, dass Sie nicht so viel Speicher haben und 'malloc' gibt' NULL' zurück. –

Antwort

3

Der wahrscheinlichste Grund könnte sein, dass malloc()könnte die Menge an Speicher zuweisen scheitern Sie für anfordern. Prüfen Sie immer, ob der Speicher erfolgreich zugeordnet ist oder nicht auf diese Weise:

char *p; //some pointer 
p=malloc(size*sizeof(char)); 

if(p==NULL) 
{ 
    printf("unsuccessfull memory allocation"); 
    exit(1); 
} 

Hinweis:

  • malloc() gibt die Adresse des neu zugewiesenen Speicherplatz auf erfolgreiche Zuteilung.
  • , wenn der Speicher Zuordnung nicht erfolgreich ist dann, es gibt NULL

Und wie @BLUEPIXY hat in den Kommentaren erwähnt, ist Ihr strcat() wird scheitern, auch wenn Zuweisung erfolgreich ist,

versuchen Sie die string vor der Verwendung zu initialisieren:

*string = 0; 

oder kopieren string vor strcat() Funktion.

+0

Ich habe das getestet. Es geht nicht, wenn Bedingung. Bedeutet, dass es den Speicher zuweist. – denis

+2

Wie @BLUEPIXY geschrieben hat, wird 'strcat' fehlschlagen, selbst wenn genügend Speicher vorhanden ist. –

+1

Wenn er tatsächlich 1e18 Bytes hat (~ 1e9TB), ist wahrscheinlich irgendwo ein NULL drin. Das 'strcat' ist defekt, wird aber wahrscheinlich nicht ausfallen. Ich würde sicher 1e9TB RAM selbst mögen. @denis, sollten Sie Ihren Test erneut überprüfen. – evaitl

1

Sie versuchen, 20000000TB zuzuweisen. Sie haben sicherlich nicht so viel Speicher. malloc schlägt fehl und gibt einen NULL-Zeiger zurück, auf den Sie dann schreiben möchten!

0

Ich denke, dass die Ursache des Fehlers die Größe des Speichers ist, den Sie versuchen, malloc.

unsigned lange lange Größe = 2 * pow (10,18);

char * Zeichenfolge = malloc (Größe);

Sie versuchen, zu malloc: 2000000000000000000 Bytes

Das ist 2 EB (EB: Exabyte) 1 EB = 1000000 GB