2017-10-27 1 views
-5

Ich habe die folgenden Codes:strcpy Ursache Programm empfangene Signal SIGSEGV, Fehler Segmentation

int main(int argc,char * argv[]) 
{ 

    char* SourceWeightFiel; 

    char* TargetWeightFile; 

    strcpy(SourceWeightFiel, argv[1]); 

    strcpy(TargetWeightFile, argv[2]); 

return 1; 
} 

, wenn ich es in gdb debuggen, es ist Ok in den ersten strcpy ausgeführt wird, aber wenn es geht in die zweite strcpy, es gibt immer die folgenden Fehler:

26  strcpy(SourceWeightFiel, argv[1]); 
(gdb) n  
27  strcpy(TargetWeightFile, args);  
(gdb) n 

Program received signal SIGSEGV, Segmentation fault.  
__strcpy_sse2_unaligned() 
    at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:94  
94 ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: No such file or directory.  
(gdb) 

Ich kann nicht herausfinden, warum, und habe keine Ahnung, wie Sie es beheben. Weiß jemand davon?

+3

Diese Aussagen strcpy (SourceWeightFiel, argv [1]); strcpy (TargetWeightFile, argv [2]); macht keinen Sinn und hat ein undefiniertes Verhalten, weil die Zeiger nicht initialisiert sind und unbestimmte Werte haben –

+0

Es ist C++. Verwenden Sie std :: string und nicht strcpy. –

+0

Sie testen nicht, ob argv [1] oder argv [2] existieren. –

Antwort

0

Angenommen, Sie verwenden C-Stil-Strings aus einem Grund - wenn nicht, verwenden Sie einfach std :: string als @ manni66 oben vorgeschlagen.

Sie deklarieren Ihre Variablen SourceWeightFiel und TargetWeightFiel, aber Sie vergeben keinen Speicherplatz, um sie zu kopieren. Sie können es entweder selbst mit malloc() (oder ähnlich) tun oder strdup()

verwenden Vergessen Sie nicht, den zugewiesenen Speicherplatz (welche Methode Sie verwenden) freizugeben, sobald Sie damit fertig sind.

int main(int argc,char * argv[]) { 

    char* SourceWeightFiel; 
    char* TargetWeightFile; 

    SourceWeightFiel = strdup (argv[1]); 
    TargetWeightFile = strdup (argv[2]); 

    /* After you've used them... */ 

    free (TargetWeightFile); 
    free (SourceWeightFiel); 
    return 1; 
} 
+0

Das ist ein guter Rat für C. –

0

Das grundlegende Problem ist, dass strcpy keinen Speicher nicht vor, doch es nur Kopien von einem Ort zum anderen und geht davon aus, dass genügend Platz am Zielort zugeordnet ist.

Sie müssen genügend Speicherplatz in SourceWeightFiel und TargetWeightFile zuweisen.

Oder noch besser, verwenden Sie strdup.

Wie schon erwähnt, wird std :: string auch die Sache vereinfachen.

0

Eine andere Lösung:

int main(int argc,char * argv[]) 
{ 
    char SourceWeightFiel[256]=""; 
    char TargetWeightFile[256]=""; 

    strcpy(SourceWeightFiel, argv[1]); 
    strcpy(TargetWeightFile, argv[2]); 

return 1; 
} 
Verwandte Themen