2016-07-20 9 views
-5

Ich weiß, das ist wahrscheinlich etwas Grundsätzliches, die etwa 1000 mal gesprochen wurde, aber ich glaube, ich brauche Hilfe zu verstehen, warum die folgenden ein Segmentierungsfehler erzeugt:C++ char * [255] Herstellung von Segmentierungsfehler

char* outputPath = new char[255]; 
sprintf(outputPath, "/home/istrab/iStrabGUI Output/%s/%s/0/Frames",patientName, techName); 

Die Ich frage mich, ob das der Grund dafür ist, dass ich nach etwas Nachforschung die Größe des Arrays auf 255 festgelegt habe, von dem ich weiß, dass es groß genug wäre, um den String zu halten, den ich schreiben möchte. Ich stellte auch sicher, dass es initialisiert wurde, bevor ich versuchte, darauf zu schreiben. Ich machte auch doppelt sicher, dass alle beteiligten Variablen früher im Code initialisiert wurden oder das Programm bis dahin verlassen hätte. Könnte ich das anders machen? Ist es in der Zeichenfolge selbst oder in der Art, wie ich das Array initialisiert habe?

Dieser Code geschrieben wurde mit Qt 4.8.6 in C++

+4

Warum nicht ein String-Objekt anstelle eines Char-Arrays verwenden? Würde dir viele Kopfschmerzen ersparen. – DeathTails

+2

'char outputPath [255]' wäre mehr idiomatische IMO. Außerdem gibt es Konstanten/Definitionen für eine maximale Pfadlänge, die Sie verwenden sollten (für Portabilität, wenn nichts anderes) –

+0

Beenden Sie bereits die Verletzung der [Null eine Unendlichkeitsregel] (https://en.wikipedia.org/wiki/Zero_one_infinity_rule). – IInspectable

Antwort

3

Verwenden QString wenn Wenn Sie Qt verwenden sowieso:

QString outputPath; 
outputPath.sprintf("/home/istrab/iStrabGUI Output/%s/%s/0/Frames", 
        patientName, 
        techName); 
+0

Danke. Ich habe diese Methode ausprobiert und das Problem wurde behoben. – Coliwack

0

Vars patientName, TechName sind das Problem, sollten Sie OutputPath die Größe verwenden, um größer zu werden und werden nicht überschwemmt werden.

Aber ich versuche herauszufinden, eine Zeichenfolge Var aus String-Bibliothek zu verwenden. Look here

1

Run GDB auf sie und eine Pause setzen auf dieser Linie drucken, dann wird der Wert von patientName und TechName. Einer der beiden ist wahrscheinlich null.

+0

Ich weiß, dass sie nicht sind, weil ich Druckbefehle verwendete, um sie zu drucken, bevor die störende Linie erreicht wird. – Coliwack

1

Sie können QDir Methoden verwenden.

QDir path("/home/istrab/iStrabGUI Output/"); 
path.cd(patientName); 
path.cd(techName); 
path.cd("/0/Frames"); 

QString pathString = path.path();